我創建了一個監控子進程並在失敗或退出時重新啓動它的基本示例。什麼是這樣做的首選/更強大的方法?不斷調查地位變化是否是一種好的做法?我的理解是我應該使用類似SIGCHLD
的東西,但一直沒有找到任何好的例子。當失敗/退出時監控並重新啓動子進程
我主要是一個嵌入式C編碼器,這是我第一次嘗試去理解fork()
。這段代碼的目的最終將是監視使用exec()
的另一個程序的調用,並在出現故障時重啓該程序或完成。
編輯: 從@cnicutar我已經在某種程度上,我認爲重寫下面的例子意見,使希望更多的意義在於它是利用給別人後面了。我希望父母監視子進程,同時處理其他事情,並在子進程失敗/完成時在新的fork
上撥打exec
的新呼叫。我想嘗試和使用UNIX的信號來實現這個
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
int main(int argc, char *argv[])
{
pid_t cpid;
int status;
cpid = fork();
for (;;)
{
switch (cpid)
{
case -1 : //Fork failure
exit(EXIT_FAILURE);
break;
case 0 : //Child Process
exec(some function);
return 0; //exit child process
break;
default : //Parent process
if (waitpid(-1, &status, WNOHANG) != 1) cpid = fork(); //restart
//Do parent stuff here...
break;
}
}
}
謝謝,我想我現在意識到我的問題並不是如何監視/等待子進程結束,但重啓它的最佳實踐是什麼。我的方法似乎設置一個標誌似乎工作,但有一個本地的C,unix方式來處理這個? 'if(alive == 0)cpid = fork(); alive = 1;' – CatsLoveJazz
@CatsLoveJazz我不確定你是否真的需要國旗。 fork到達的唯一方法是'waitpid'解除阻塞,當進程死亡或被信號中止時發生。 – cnicutar
當然,對不起。我的意思是假設父進程沒有在等待,只在每個主循環中檢查一次子進程。如何在不每次調用fork的情況下進行處理? – CatsLoveJazz