とりあえず、ということでNmapのmain.ccを見てみました。
/* Trap these sigs for cleanup */
#if HAVE_SIGNAL
signal(SIGINT, sigdie);
signal(SIGTERM, sigdie);
#ifndef WIN32
signal(SIGHUP, sigdie);
signal(SIGCHLD, reaper);
#endif
#endif
ああ、懐かしい・・・

思えば、会社に入って初めて覚えたのはC言語(Unix)だった。で、初めて開発したのは、C言語のUnixデーモンプロセスだったなあ。それから、UnixのInitデーモンもどきを開発したりしていました。
そのおかげで、Unix固有のプロセス通信・シグナル・プロセス管理・メモリ管理などのプログラミングのノウハウを身につけられました。
よく考えると、プロセス管理・シグナル管理手法などの”常識”をまとめた書籍ってみたことないなあ。会社でも口伝的なもので継承している気がします。
SIGCHLDも結構曲者なんですよね。親プロセス側で、非シグナルセーフな関数を使っていると、タイミング次第で子プロセスが終了してSIGCHLDを親プロセスが受信すると停止してしまったり。
色々と悩んだ思い出があります。