是否有可能在另一个进程中更改信号处理程序?
问题描述:
今天我发现了nohup
工具,并在想它的实现。具体来说,似乎必须有一种方法来告诉另一个进程或子进程忽略某些信号。有没有系统调用,或类似的东西,是否这样做?是否有可能在另一个进程中更改信号处理程序?
答
进程在执行调用后保留信号掩码。
参见来源的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将无法正常工作。
+1。如果删除所有附加处理,那基本上就是2行代码。 :) – casablanca 2010-08-13 22:23:45