簡體   English   中英

失敗/退出時監視並重新啟動子進程

[英]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這才有意義。


說到明智的話。 某些函數不能從信號處理程序中調用,以免您向程序中添加困難的錯誤。 查找“異步信號安全”功能:這些只能從信號處理程序中調用。 一些最常見的函數(如printfmalloc )無法從信號處理程序中調用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM