2013-03-19 87 views
3

我想將退出狀態0從execve進程發送到啓動它的進程。 因爲成功execve永遠不會返回,所以我無法做任何事情之後。但如果execve運行成功,我想要。execve的返回狀態

由於提前

+1

這個鏈接可以幫助你http://stackoverflow.com/questions/13532391/how-to-get-error- of-execvp-in-the-fork – MOHAMED 2013-03-19 10:44:26

+0

OP希望父級知道孩子的'exec'成功進行。可以通過多種方式(通過管道或特殊的退出狀態)向父節點報告「exec」失敗,但「exec」成功很難確認,因爲成功的'exec'定義意味着我們的進程不再運行。 – user4815162342 2013-03-19 10:53:25

+0

@ user4815162342:用「* ...一個孩子的'exec' ... *」表示創建孩子本身的exec或由兒童完成的一個exec(這個轉變是由exec創建的'由父母)? – alk 2013-03-19 11:07:20

回答

1

等待您處理由fork()完成啓動,您可以使用wait()

/* parent */ 
int status; 
while (wait(&status) != uproc.pid) { 
    printf("waiting for child to exit"); 
    } 

,並在此基礎上question

孩子的退出狀態是由提供wait函數,在status變量中。

您可以通過使用WEXITSTATUS宏獲得退出狀態,但是隻有當程序正常退出(即所謂的exit或從main函數返回):

if (WIFEXITED(status)) 
    printf("Child exit status: %d\n", WEXITSTATUS(status)); 
else 
    printf("Child exited abnormally\n"); 
+0

這不會驗證'exec' *成功*,只是程序以成功狀態退出。當執行長時間運行的程序時,這可能會產生差異。 – user4815162342 2013-03-19 10:51:04

5

您可以驗證EXEC 通過成功使用FD_CLOEXEC

  • 創建管道。

  • fork。

  • 在子中,關閉管道的讀取端,並在管道的寫入端設置FD_CLOEXEC標誌。然後繼續exec。如果exec成功,則由於FD_CLOEXEC,管道將自動關閉。如果exec失敗,則向管道寫入一個字節並退出。

  • 在父項中,關閉管道的寫入結束並從讀取結束讀取。如果讀取0字節(EOF),則表示exec成功。如果您讀取管道中的一個字節,則表示exec失敗。

在故障的情況下寫在管的數據可以被用於傳送錯誤的信息,如後execerrno值。

代碼,錯誤檢查略去了,應該是這樣的:

int pipe_fds[2]; 
pipe(pipe_fds); 
if (!fork()) { 
    close(pipe_fds[0]); 
    fcntl(pipe_fds[1], F_SETFD, F_CLOEXEC); 
    execve(...); 
    write(pipe_fds[1], "", 1); 
    _exit(1); 
} 
else { 
    int n; 
    char out; 
    close(pipe_fds[1]); 
    n = read(pipe_fds[0], &out, 1); 
    if (n == 0) 
    printf("exec successful\n"); 
    else 
    printf("exec failed\n"); 
} 
+0

未能執行'exec',是否可以保證SIGCHLD信號將在EOF通知之前從孩子死亡關閉管道的事實中傳遞出來?我喜歡技術背後的想法;我只是想知道是否有比賽條件。 – 2013-03-19 11:05:07

+0

@JonathanLeffler我不認爲有任何這樣的保證,但它不應該是必要的。如果'exec'失敗,通過管道發送一些數據很容易消除歧義。 – user4815162342 2013-03-19 11:29:52

+0

@JonathanLeffler我現在編輯的答案不再依賴'SIGCHLD'。 – user4815162342 2013-03-19 11:32:10