繁体   English   中英

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

[英]Why can't the signal handler in the child process be triggered?

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

我想到的设计是:父级为SIGALRM注册一个信号处理程序。 然后,它派生一个将触发SIGALRM的子级,然后继续调用fgets。 SIGALRM将触发处理程序,该处理程序将终止父进程。 但是,当我在64位ubuntu 14.04上执行此操作时,不会触发处理程序,并且程序仅等待用户永远输入fget。

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

#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(1);
sleep(2);

最后, printf()在信号处理程序(安全函数列表 printf()中并不安全。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM