2014-03-05 61 views
3

我創建了一個監控子進程並在失敗或退出時重新啓動它的基本示例。什麼是這樣做的首選/更強大的方法?不斷調查地位變化是否是一種好的做法?我的理解是我應該使用類似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; 
     } 
    } 
} 

回答

2

添加SIGCHLD處理程序不會買你多少,因爲你已經等待所有的時間,只有做到這一點 - 沒有什麼別的「中斷」。

我會建議的一件事是一個門檻,這樣的過程不會死/開始太頻繁。

我的理解是,我應該利用類似SIGCHLD但 一直無法找到任何很好的例子

您使用SIGCHLD知道何時等待。一個典型的SIGCHLD處理程序只是在循環中執行waitpid,直到沒有孩子離開。在你的情況下,你不需要這樣做,因爲你的主代碼是在waitpid上停止的循環。


編輯

你可以找到大量的實例爲SIGCHLD處理。一個這樣的例子是How can I handle sigchld in C。在代碼中,while後,你可以fork

while((pid = waitpid(-1, &status, WNOHANG)) > 0) 
     ; 

pid = fork(); 
switch (pid) 
... 

再次重申,如果你這樣做SIGCHLD都會被調用就有一名兒童死於時間和你正確地等待它後,你可以fork另一個。如果父母在此期間有更好的事情做,而不是阻止waitpid,這纔有意義。


給智者的話。有些函數不能從信號處理函數中調用,以免給程序添加難題。查找「異步信號安全」功能:只能從信號處理程序調用這些功能。某些最常用的功能(如printfmalloc)不能從信號處理程序調用。

+0

謝謝,我想我現在意識到我的問題並不是如何監視/等待子進程結束,但重啓它的最佳實踐是什麼。我的方法似乎設置一個標誌似乎工作,但有一個本地的C,unix方式來處理這個? 'if(alive == 0)cpid = fork(); alive = 1;' – CatsLoveJazz

+0

@CatsLoveJazz我不確定你是否真的需要國旗。 fork到達的唯一方法是'waitpid'解除阻塞,當進程死亡或被信號中止時發生。 – cnicutar

+0

當然,對不起。我的意思是假設父進程沒有在等待,只在每個主循環中檢查一次子進程。如何在不每次調用fork的情況下進行處理? – CatsLoveJazz

相關問題