
366
|
第十章
* 單一處理程序。
*/
if (signal (SIGTERM, signal_handler) == SIG_ERR) {
fprintf (stderr, "Cannot handle SIGTERM!\n");
exit (EXIT_FAILURE);
}
/* 把 SIGPROF 的行為重置為預定值。 */
if (signal (SIGPROF, SIG_Dfl) == SIG_ERR) {
fprintf (stderr, "Cannot reset SIGPROF!\n");
exit (EXIT_FAILURE);
}
/* 忽略 SIGHUP */
if (signal (SIGHUP, SIG_IGN) == SIG_ERR) {
fprintf (stderr, "Cannot ignore SIGHUP!\n");
exit (EXIT_FAILURE);
}
for (;;)
pause ();
return 0;
}
執行與繼承
fork(建立新的行程)時,子行程會繼承其父行程的信號動作。也就是,子行程會從
它的父行程那裡為每個信號複製所註冊的動作(忽略、預定、處理)。懸而未決的信號
不會
被繼承,這是有道理的:懸而未決的信號會被送往一個特定的 pid,絕對不會是子
行程。
當一個行程被執行(經由某個
exec
系統呼叫)時,所有的信號都會被設定為它們的預定
動作,除非父行程忽略它們;此狀況下,新建立的行程也會忽略那些信號。換句話說,
父行程在叫用 ...