[英]Monitoring and restarting child process when fails/exits
我已經創建了一個監視子進程的基本示例,並在它失敗或退出時重新啟動它。 這樣做的首選/更強大的方法是什么? 持續調查狀態變化是一種好習慣嗎? 我的理解是我應該使用像SIGCHLD
這樣的東西,但卻找不到任何好的例子。
我主要是一個嵌入式C編碼器,這是我第一次嘗試理解fork()
。這段代碼的目的最終是使用exec()
監視對另一個程序的調用,如果失敗則重啟該程序或完成。
編輯:在@cnicutar發表評論之后,我以一種我認為更有意義的方式重寫了下面的例子,希望以后對某人有用。 我想父母監控子女的過程,而foing其他的東西,並作出新的呼叫exec
一個新的fork
時,子進程失敗/完成。 我想嘗試使用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;
}
}
}
添加一個SIGCHLD
處理程序不會給你帶來太大的SIGCHLD
因為你已經等待所有的時間而且只是這樣做 - 沒有別的東西可以“中斷”。
我建議的一件事是一個門檻,使得這個過程不會經常死亡/開始。
我的理解是我應該使用像SIGCHLD這樣的東西,但卻找不到任何好的例子
您使用SIGCHLD
知道何時等待。 典型的SIGCHLD
處理程序只是在循環中執行waitpid
,直到沒有孩子離開。 在您的情況下,您不需要它,因為您的主代碼是在waitpid
停止的循環。
編輯
您可以找到大量SIGCHLD
處理示例。 一個這樣的例子是我如何在C中處理sigchld 。 在那段代碼中, while
你就可以fork
:
while((pid = waitpid(-1, &status, WNOHANG)) > 0)
;
pid = fork();
switch (pid)
...
重申一下,如果你這樣做,每次孩子死亡時都會調用SIGCHLD
,在你正確等待它之后,你可以fork
另一個。 只有父母在此期間有更好的事情要做而不是僅僅阻止waitpid
這才有意義。
說到明智的話。 某些函數不能從信號處理程序中調用,以免您向程序中添加困難的錯誤。 查找“異步信號安全”功能:這些只能從信號處理程序中調用。 一些最常見的函數(如printf
和malloc
)無法從信號處理程序中調用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.