. 그러나 나는 나의 신청을 막고 싶지 않아, 그래서 나는 WNOHANG을 사용한다.WHOHANG으로 waitpid를 사용하는 동안 상태가 잘못되었습니다. 내 자식 프로세스가 종료 될 때 알고 싶습니다.
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void handler(int nsig) {
int status;
waitpid(-1, &status, WNOHANG);
printf("nsig=%i; status=%i\n", nsig, status);
if (WIFEXITED(status)) {
printf("Exited\n");
}
}
int main() {
struct sigaction act;
act.sa_handler = handler;
if (sigaction(SIGCHLD, &act, 0) < 0) {
fprintf(stderr, "sigaction failed\n");
exit(-1);
}
pid_t fpid;
fpid = fork();
if (fpid == 0) {
execlp("okular", "okular", 0);
}
while(1);
return 0;
}
평소와 같이 "okular"를 닫으면 정상적으로 작동합니다. 내가
kill -STOP OKULAR_PID
같은 것을 할 경우
$ ./test
nsig=17; status=0
Exited
는하지만 동일한 출력을 가지고 Okular의 사실에 출구를하지 않았기 때문에 즉, 나에게 잘못입니다.
이것은 문제가 아니지만 신호 처리기에서'printf'를 호출하면 일반적으로 정의되지 않은 동작이 발생합니다. –
경고 해 주셔서 감사합니다. – Ximik