#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)。

09-26 14:33