问题 信号处理程序的父和子行为


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


2824
2018-02-13 11:33


起源



答案:


如果你这样做 fork (没有进一步的 exec*)在注册信号处理程序之后,将在父进程和子进程中使用相同的信号处理程序。也就是说,如果你做的不是 exit 在你的 SIGINT 处理程序,父母和孩子都不会退出(如何 SIGINT 发送与此无关)。

如果你的意思是 SIGINT 从...发送 终奌站 (通过 vintr 通常的角色 Ctrl+C):它将由使用的进程接收 终奌站 作为控制终端。也就是说,除非你将孩子或父母从控制终端分离,否则他们都会做出反应 Ctrl+C 通过打电话给你 SIGINT 处理程序。


14
2018-02-13 11:46



但是信号处理程序在fork()之前注册,因此子项不应该有副本。在fork()之后,子进程应该执行fork()之后的语句。信号处理程序注册只能在父级中。 - Puneet
@Puneet它 是 孩子继承,无论你怎么想它 应该 是。看到 man sigaction。这有什么奇怪的?之前打开过文件描述符 fork 也是继承的。信号唯一特别的是非默认,非忽略 处理器 重置 execve 和朋友(因为处理程序的地址在新的可执行文件中没有任何意义),但没有这样的事情发生 fork。 - Anton Kovalenko
谢谢你先生......怀疑已经清除了...... - Puneet


答案:


如果你这样做 fork (没有进一步的 exec*)在注册信号处理程序之后,将在父进程和子进程中使用相同的信号处理程序。也就是说,如果你做的不是 exit 在你的 SIGINT 处理程序,父母和孩子都不会退出(如何 SIGINT 发送与此无关)。

如果你的意思是 SIGINT 从...发送 终奌站 (通过 vintr 通常的角色 Ctrl+C):它将由使用的进程接收 终奌站 作为控制终端。也就是说,除非你将孩子或父母从控制终端分离,否则他们都会做出反应 Ctrl+C 通过打电话给你 SIGINT 处理程序。


14
2018-02-13 11:46



但是信号处理程序在fork()之前注册,因此子项不应该有副本。在fork()之后,子进程应该执行fork()之后的语句。信号处理程序注册只能在父级中。 - Puneet
@Puneet它 是 孩子继承,无论你怎么想它 应该 是。看到 man sigaction。这有什么奇怪的?之前打开过文件描述符 fork 也是继承的。信号唯一特别的是非默认,非忽略 处理器 重置 execve 和朋友(因为处理程序的地址在新的可执行文件中没有任何意义),但没有这样的事情发生 fork。 - Anton Kovalenko
谢谢你先生......怀疑已经清除了...... - Puneet