为什么不能触发子进程中的信号处理程序?

我的目的是为fgets创造1秒的时间。 如果在1秒内未收到任何输入,则程序终止。

我想出的设计是:父级为SIGALRM注册一个信号处理程序。 然后它会分叉一个触发SIGALRM的孩子,然后继续调用fgets。 SIGALRM将触发杀死父进程的处理程序。 但是当我在64位的ubuntu 14.04上执行此操作时,处理程序不会被触发,程序只是等待用户永远输入fgets。

为什么会发生这种情况,我该如何解决这个问题?

#include "csapp.h" void handler() { printf("lazy man\n"); kill(SIGKILL, getppid()); exit(0); } int main() { char buf[100]; signal(SIGALRM, handler); pid_t pid; if ((pid = fork()) == 0) { alarm(1); } else { fgets(buf, 100, stdin); printf("%s", buf); } return 0; } 

如果你需要时间阅读 kill() 手册 ,你会发现你错过了参数的顺序。

int kill(pid_t pid,int sig);

固定:

 kill(getppid(), SIGKILL); 

另外,您的孩子在信号提升之前终止执行,您必须在调用alarm()之后添加sleep() alarm()以使其等待:

 alarm(1); sleep(2); 

最后, printf()在信号处理程序中是安全的,安全function列表 。

这种分叉和杀戮似乎是错误的。 只需设置警报,为SIGALRM注册一个空信号处理程序,然后检查fgets()的返回值 – 如果失败,检查errno == EINTR; 如果它 – 它被信号打断了。