Processo filho - ouça o evento quando o pai morre

1

Eu tenho um processo filho desanexado. Sabe o pai dos pais. Existe alguma maneira no MacOS e no Linux que eu possa ouvir quando o processo pai sai do processo filho?

Eu preciso fazer uma chamada para excluir um arquivo de bloqueio do filho, quando o processo pai for interrompido.

Estou procurando uma solução que não exija pesquisa.

Ouvi dizer que waitid() pode fazer isso. Eu tenho esse pequeno programa que compila no MacOS com o gcc, mas ele sai com o código 255 - meu único palpite é que isso é porque waitid () não funcionará com processos que não são processos filho do processo atual?

#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);
}
    
por Alexander Mills 28.02.2018 / 17:37

1 resposta

0

No MacOS, o seguinte, na verdade, tem o comportamento que estou procurando (e possivelmente não usa polling?)

link

#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;
}
    
por 01.03.2018 / 00:24