별도의 하위 프로세스가 있습니다. 상위 프로세스의 pid를 알고 있습니다. MacOS 및 Linux에서 상위 프로세스가 종료될 때 하위 프로세스로부터 수신 대기할 수 있는 방법이 있습니까?
상위 프로세스가 종료되면 하위 프로세스에서 잠금 파일을 제거하기 위해 호출해야 합니다.
폴링이 필요하지 않은 솔루션을 찾고 있습니다.
waitid()
가능하다고 들었습니다 . MacOS에서 gcc를 사용하여 컴파일된 작은 프로그램이 있지만 코드 255로 종료됩니다. 유일한 추측은 waitid()가 현재 프로세스의 하위 프로세스가 아닌 프로세스에서 작동하지 않기 때문이라는 것입니다.
#include <stdlib.h>
#include <sys/wait.h>
#include <stdio.h>
int main(int argc, char *argv[]) {
pid_t pid = atoi(argv[1]);
printf("pid = %jd\n", (intmax_t) pid);
siginfo_t sig;
return waitid(P_PID, pid, &sig, WEXITED|WNOWAIT);
}
답변1
MacOS에서 다음은 실제로 내가 찾고 있는 동작을 가지고 있습니다. (아마도 폴링을 사용하지 않을 수도 있습니다.)
https://github.com/brainopener/mac-pid-waiter
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/event.h>
int main(int argc, const char * argv[]) {
pid_t pid;
if(argc!=2 || (pid=atoi(argv[1]))<=0)
{
fprintf(stderr,"USAGE\nwaiter pid\n");
return 1;
}
int kq=kqueue();
if (kq == -1) {
fprintf(stderr,"kqueue returned -1.");
return 1;
}
struct kevent ke;
EV_SET(&ke, pid, EVFILT_PROC, EV_ADD, NOTE_EXIT, 0, NULL);
if (kevent(kq, &ke, 1, NULL, 0, NULL)<0) {
fprintf(stderr,"kevent failed.");
return 1;
}
for(;;) {
memset(&ke,0,sizeof(struct kevent));
if(kevent(kq, NULL, 0, &ke, 1, NULL)<0){
fprintf(stderr,"kevent failed.");
return 1;
}
if (ke.fflags & NOTE_EXIT)
break;
}
return 0;
}