FreeBSD에서 SIGCHLD 신호를 잡는 데 sigtimedwait()을 사용하는 데 문제가 있습니다. 다음 소스/리눅스 7 데비안 GNU에서 잘 작동하지만 나에게 FreeBSD의 9.1에 일시적으로 사용할 수없는 자원 제공 : 리눅스에BSD에서 sigtimedwait()을 사용하여 SIGCHLD 잡기
#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;
}
출력 : FreeBSD의에
SIGCHLD is 17
received signal 17 from 27600 with status 123
출력 :
SIGCHLD is 20
sigtimedwait failed: Resource temporarily unavailable
을
signal()을 사용하면 BSD에서 잘 작동하지만 이것은 내가 원하는 것만은 아니다. 내가 뭘 놓치고 있니?