2013-02-26 99 views
1

我有一個子進程(在MacOS上運行),如果父進程退出,退出,終止,死亡或崩潰,我想自己殺死自己。遵循How to make child process die after parent exits?的建議,如果父程序崩潰,我無法安靜地自殺。它會去100%的CPU,直到我手動殺死它。如果父母死亡,子進程不會自殺

這裏是代碼的關鍵點:

int main(int argc, char *argv[]) 
{ 
    // Catch signals 
    signal(SIGINT, interruptHandler); 
    signal(SIGABRT, interruptHandler); 
    signal(SIGTERM, interruptHandler); 
    signal(SIGPIPE, interruptHandler); 

    // Create kqueue event filter 
    int kqueue_fd = kqueue(); 
    struct kevent kev, recv_kev; 
    EV_SET(&kev, parent_pid, EVFILT_PROC, EV_ADD|EV_ENABLE, NOTE_EXIT, 0, NULL); 
    kevent(kqueue_fd, &kev, 1, NULL, 0, NULL); 

    struct pollfd kqpoll; 
    kqpoll.fd = kqueue_fd; 
    kqpoll.events = POLLIN; 

    // Start a run loop 
    while(processEvents()) 
    { 
    if(kill(parent_pid, 0) == -1) 
     if(errno == ESRCH) 
     break; 

    if(poll(&kqpoll, 1, 0) == 1) 
     if(kevent(kqueue_fd, NULL, 0, &recv_kev, 1, NULL)) 
     break; 

    parent_pid = getppid(); 
    if(parent_pid == 1) 
     break; 

    sleep(a_short_time); 

    // (simple code here causes subprocess to sleep longer if it hasn't 
    // received any events recently) 
    } 
} 

回答

0

這裏回答我的問題:

這樣做的原因的問題是不是下來檢測父進程是否已經死亡。在processEvents()我從父進程輪詢管道,看是否有任何溝通。當父母死亡時,poll()返回值1,並且讀取循環認爲有無限數據等待讀取。

解決方案是檢測管道是否已斷開連接。