FreeBSD で sigtimedwait() を使用して SIGCHLD シグナルをキャッチするのに問題があります。次のソースは Debian GNU/Linux 7 でうまく動作しますが、FreeBSD 9.1 では一時的に利用できないリソースを提供してくれます。
#include <stdio.h>
#include <signal.h>
#include <errno.h>
#include <stdlib.h>
#include <time.h>
int main() {
        sigset_t set;
        pid_t pid;
        printf("SIGCHLD is %i\n", SIGCHLD);
        sigemptyset(&set);
        sigaddset(&set, SIGCHLD);
        sigprocmask(SIG_BLOCK, &set, NULL);
        pid = fork();
        if(pid == -1) {
                printf("fork failed: %s\n", strerror(errno));
                exit(1);
        } else if(pid) {
                sigset_t set2;
                siginfo_t siginfo;
                struct timespec timeout = {3, 0};
                int signal;
                sigemptyset(&set2);
                sigaddset(&set2, SIGCHLD);
                signal = sigtimedwait(&set2, &siginfo, &timeout);
                if(signal == -1) {
                        printf("sigtimedwait failed: %s\n", strerror(errno));
                        exit(2);
                } else {
                        printf("received signal %i from %i with status %i\n", signal, siginfo.si_pid, siginfo.si_status);
                }
        } else {
                sleep(1);
                exit(123);
        }
        return 0;
}
Linux での出力:
SIGCHLD is 17
received signal 17 from 27600 with status 123
FreeBSD での出力:
SIGCHLD is 20
sigtimedwait failed: Resource temporarily unavailable
signal() を使用すると BSD で問題なく動作しますが、これは私が望むものではありません。私は何が欠けていますか?