2011-11-28 23 views
16

我試圖讓我的程序重新啓動自己,但似乎沒有任何工作。我試過用fork(),但是查殺後parent進程child也被殺死了。如何讓程序自行重啓? (Linux進程)

CODE

void sigup_handler(int signum) { 
    int pid = fork(); 
    if (pid == 0) { 
     execve("prog2", NULL); 
    } 
    else 
     kill(getpid(), SIGTERM); 
} 

int main() { 
    puts("Program 2 started."); 
    signal(SIGHUP, sigup_handler); 
    sleep(50); 
    puts("Program 2 terminated."); 
    return 0; 
} 

回答

13

爲什麼與fork打擾,如果你只是要killparent?只需要做exec。該程序的新實例將仍然是相同的過程,但將有效地重新啓動。

+0

它輸出節目2開始daemon(3)。計劃2開始。用簡單的execve(「prog2」,NULL);這使我困惑。不應該顯示「程序2已終止」。 – bvk256

+0

它永遠不會調用「程序2終止」,因爲父母已經用kill(getpid(),...)終止了自己; –

+0

好的,那麼。無論如何,這個信息很容易通過將它放置在一個進程被保證終止的地方來實現。 – bvk256

3

使用2級分叉。父母的「監視」應用程序,它可以分散兒童並監視他們的狀態。如果孩子死亡,顯示器將啓動一個新的。孩子們然後自己動手做任何他們必須做的事情。但是,如果您不需要應用程序的「新」副本具有與被殺的狀態相同的狀態,那麼使用exec()啓動新的獨立副本可能是更好的選擇,可以保存你必須讓這個監視器副本坐在裏面。