是否有可能在另一个进程中更改信号处理程序?

问题描述:

今天我发现了nohup工具,并在想它的实现。具体来说,似乎必须有一种方法来告诉另一个进程或子进程忽略某些信号。有没有系统调用,或类似的东西,是否这样做?是否有可能在另一个进程中更改信号处理程序?

source与你同在:)

Disclamer:这句话其实不是我,而是Marshall Kirk McKusick

+0

+1。如果删除所有附加处理,那基本上就是2行代码。 :) – casablanca 2010-08-13 22:23:45

进程在执行调用后保留信号掩码。

参见来源的nohup这里,例如:

http://www.opensource.apple.com/source/shell_cmds/shell_cmds-118/nohup/nohup.c

有关EXEC细节()调用在这里看到:

http://www.opengroup.org/onlinepubs/009695399/functions/exec.html

即:

新流程至少应继承 个从 调用进程映像以下属性:

...进程信号掩码(见 sigprocmask()执行)

nohup的根本exec的你给它忽略了HUP信号之后的命令。从源代码:

signal (SIGHUP, SIG_IGN); 
/* skipping some stuff ... */ 
execvp (*cmd, cmd); 

我假设这意味着,如果指定的命令不喜欢的东西:

signal (SIGHUP, SIG_DFL); /* restore default HUP signal handler */ 

的nohup将无法正常工作。

+0

有一个约定,程序应该留下仅在条目中被忽略的信号(并且不要为它们设置处理程序或默认操作)。 这个约定主要用于继承SIGINT和SIGQUIT的nohup和非作业控制背景(&)过程。 (使用setsid()和作业控制(独立进程组)等更多现代化设施,不需要继承信号,因为违规信号根本不会被发送。) – jilles 2010-08-13 22:45:15

+0

啊,这似乎是一个明智的约定。我无法想象为什么有人想将HUP重置为默认值,但我想我会指出这一点。 – cam 2010-08-13 22:54:42