2013-10-30 33 views
0

有沒有一種安全的方式或者我怎麼能保證常見的做法,我有execvp執行兒童生活在一個良好的狀態?如何確保兒童在執行通話後生活?

例如:我讓我的程序的用戶爲程序中的某些數據選擇自定義處理器(可以說他想用bzip2 -zc -來處理它們)。我創建這個過程與通常fork()execvp()併爲每個標準輸入,輸出和錯誤一個pipe(), dup2()。但是我不能影響用戶是否給了我一個正確的命令調用或者因爲某些參數錯誤而死的東西(例如,他可能會給我cat foo但foo文件不存在,因此cat會立即退出)。

我可以以某種方式確保我執行該用戶命令至少要經過之前,我開始與輸入餵養它是在一個良好的狀態 - 等待我的輸入 - 而不是已經死亡或正在死亡?

+0

檢查您的寫入是否成功。如果管道另一端的孩子沒有讀取任何數據而死亡,則寫入將失敗,您將(通常)獲取SIGPIPE和SIGCHLD。 –

回答

0

如果他連給孩子管道關閉的父親將收到一個SIGPIPE。如果孩子死亡,所有這些管道都關閉,因此發送SIGPIPE。

+0

我相信只有當父進程試圖在封閉的管道上「寫」時,它纔會得到一個'SIGPIPE'。 –

+0

或者當它試圖從這樣的管道讀取。如果家長既不這樣做,也不需要關心孩子是否在跑步。至少在這種情況下(用戶定義的轉換器)。 – Alfe

+0

爲晚期重播。這正是我目前正在做的,以防止崩潰和不當行爲。但是,這充分說明了錯誤處理的猜測 - 你永遠不知道孩子爲什麼會死亡(就像我錯誤的命令字符串的例子)。 – mageta

3

您可以使用

waitpid(ChildPID, &status, WNOHANG); 

如果返回0意味着孩子還活着。