【发布时间】:2014-11-02 04:27:41
【问题描述】:
#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
似乎 SIGALRM 在调用 alarm(1) 后大约 3 秒被捕获。 为什么没有立即捕捉到信号并重新启动系统调用?
【问题讨论】:
-
请参阅How to avoid using
printf()in a signal handler?,了解关于可以和不能在信号处理程序中调用的函数的讨论。 -
@JonathanLeffler:实际上这里的使用几乎是合法的。信号处理程序不能中断非异步信号安全函数,但在从
main返回期间发生,这相当于非AS 安全的exit,可能也应该通过标准被禁止可能会错过这个案例。