sigwait() は SIGCHLD を待てない

社内でこんな話題が出たので、実験してみました。

#include
#include

int
main(int argc, char *argv[])
{
int no;
sigset_t ss;

(void) sigemptyset(&ss);
if (sigaddset(&ss, SIGCHLD) != 0) {
return (-1);
}
if (sigaddset(&ss, SIGHUP) != 0) {
return (-1);
}
if (sigaddset(&ss, SIGTERM) != 0) {
return (-1);
}
if (sigaddset(&ss, SIGINT) != 0) {
return (-1);
}
if (sigprocmask(SIG_BLOCK, &ss, NULL) != 0) {
return (-1);
}

for (;;) {
if (sigwait(&ss, &no) == 0) {
if (no == SIGTERM || no == SIGINT) {
break;
}
(void) printf("no=%d\n", no);
}
}

return (0);
}

OSX で、このプログラムをコンパイルして実行すると、HUP とかはきちんと printf() が実行されますが、CHLD は実行されませんね。
Linux だと、ちゃんと実行されました。

シグナル周りはOSによっていろいろ違うのでやっかいですね。