2013-02-13 61 views
8

信号处理程序已注册为[SIGINT]后,进程具有'fork'调用。通过命令行发送SIGINT时会发生什么?是否父母退出或孩子或两者兼而有之?父母和孩子都在循环中运行无限。信号处理程序的父级和子级的行为

回答

12

如果你在做了fork(没有进一步的exec*)之后注册了一个信号处理程序,那么在父进程和子进程中将使用相同的信号处理程序。也就是说,如果您在SIGINT处理程序中执行exit以外的任何操作,那么父母和子都不会退出(发送SIGINT的方式与此无关)。

如果意味着SIGINT终端(由vintr字符通常是Ctrl+C)发送的:它会通过使用终端作为控制终端的过程来接收。也就是说,除非您将孩子或父母从控制终端上分离出来,否则通过致电SIGINT处理程序将对Ctrl+C做出反应。

+0

但是信号处理程序在fork()之前注册,所以孩子不应该有副本。在fork()之后,子应该执行fork()之后的语句。信号处理程序注册将只在父级。 – Puneet 2013-02-13 11:57:31

+4

@Puneet无论你怎么看待它,它都会被孩子继承。见'man sigaction'。有什么奇怪的呢? 'fork'之前打开的文件描述符也被继承。信号的唯一特别之处在于,非默认的非忽略*处理程序在'execve'和好友处重置(因为处理程序的地址在新的可执行文件中没有意义),但是在fork上没有发生这种情况。 – 2013-02-13 12:12:14

+0

谢谢你,先生...怀疑清除... – Puneet 2013-02-13 12:19:29