- 论坛徽章:
- 0
|
当进程最早执行时,所有信号都重置为默认动作,除非父进程(执行新进程的那个)忽略某些信号,在这种情况下,新创建的进程也同样忽略这些信号。换一种说法,任何被父进程捕获的信号在子进程中都将被重置为默认动作,所有其它信号保持不变。由于新执行的进程没有共享父进程的地址空间,因此任何已注册的信号处理器都可能不存在。
进程执行的行为有一个值得注意的用法:当shell执行一个后台进程(或者当一个后台进程执行另一个后台进程时),新创建的进程应该忽略中断和退出信号。 因此,在shell执行一个后台进程之前,它应该设置SIGINT和SIGQUIT的动作为SIG_IGN。处理这两个信号的程序,首先检查信号是否被忽略。例如:
/* handle SIGINT, but only if it isn't ignored */
if (signal (SIGINT, SIG_IGN) != SIG_IGN) {
if (signal (SIGINT, sigint_handler) == SIG_ERR)
fprintf (stderr, "Failed to handle SIGINT!\n");
}
/* handle SIGQUIT, but only if it isn't ignored */
if (signal (SIGQUIT, SIG_IGN) != SIG_IGN) {
if (signal (SIGQUIT, sigquit_handler) == SIG_ERR)
fprintf (stderr, "Failed to handle SIGQUIT!\n");
} |
仅仅fork()时信号的行为不一样。当进程调用fork()时,子进程继承父进程的信号,这同样也是有道理的,因为子进程和父进程共享地址空间,因此父进程的信号处理器在子进程中也存在。 |
|