我有一个独立的子进程。它知道其父进程的 pid。在 MacOS 和 Linux 上,是否有某种方法可以让我在父进程退出时从子进程中监听?
当父进程终止时,我需要调用以从子进程中删除锁定文件。
我正在寻找一种不需要轮询的解决方案。
我听说waitid()
可以做到这一点。我有一个使用 gcc 在 MacOS 上编译的小程序,但它以代码 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;
}