#include <stdio.h>
#include <signal.h>
#include <fcntl.h>
#include <stdlib.h>
#define BUFSIZE 500*1024*1024
char buf[BUFSIZE];
static void sig_alrm(int signo) {
printf("%d\n",time(NULL));
printf("caught SIGALRM\n");
fprintf(stderr, "in sig_alrm\n");
}
int main()
{
int fd;
fd=open("a.txt",O_WRONLY);
signal(SIGALRM,sig_alrm);
printf("%d\n",time(NULL));
alarm(1);
write(fd,buf,BUFSIZE);
}
输出:
1414899972
1414899976
caught SIGALRM
in sig_alrm
似乎在报警(1)呼叫后3秒左右,sigalrm被捕获。
为什么不立即捕捉到信号并重新启动系统调用?
最佳答案
有些系统调用不允许中断。写入本地磁盘文件就是其中之一。写入nfs服务器上的文件取决于它是否使用intr
选项挂载(我认为这可能只允许某些类型的中断,如ctl-c)。