当执行一个程序时,所有信号的状态都是系统默认或忽略,通常所有信号都被设置它们的默认动作,除非调用exec的进程忽略该信号,确切地说,exec函数将原来设置为它们的默认动作,其他信号的状态不变,(对于一个进程原来要捕捉的信号,当其执行一个新程序之后,就自然不能再捕捉它了,因为信号捕捉函数的地址很可能在所执行的新程序文件中已无意义)
一个具体的例子是在一个交互式shell如何处理针对后台的进程的中断和退出信号,对于一个非作业控制,当在后台执行一个进程时,例如cc main.c&
shell自动将后台程序对中断和退出信号的处理方式设置为忽略,于是,当按下中断键就不会影响到后台进程,如果没有执行这样的处理,那么当按下中断键时,它不但会终止前台进程,还会终止所有后台进程。
很多捕捉这两个信号的交互式程序具有下列形式的代码
void sig_int(int),sig_quit(int);
if(signal(SIGINT,SIG_IGN)!=SIG_IGN)
signal(SIGINT,sig_int);
if(signal(SIGQUIT,SIG_IGN)!=SIG_IGN)
signal(SIGQUIT,sig_quit);
这样处理后,仅有当信号当前未被忽略时,进程才会捕捉它们。
从signal的这两种调用中也可以看出这两种函数的限制,不改变信号的处理方式,就不能确定当前信号的处理方式,我们将在sigaction中确定信号的处理方式,而无需改变它。
进程创建
当一个进程调用fork时,其子进程继承父进程的信号处理方式,因为子进程在开始时,复制了父进程的存储映像,所以信号捕捉地址是在子进程中有意义的。