回答
等待您處理由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");
這不會驗證'exec' *成功*,只是程序以成功狀態退出。當執行長時間運行的程序時,這可能會產生差異。 – user4815162342 2013-03-19 10:51:04
您可以驗證EXEC 通過成功使用FD_CLOEXEC
:
創建管道。
fork。
在子中,關閉管道的讀取端,並在管道的寫入端設置
FD_CLOEXEC
標誌。然後繼續exec
。如果exec
成功,則由於FD_CLOEXEC
,管道將自動關閉。如果exec
失敗,則向管道寫入一個字節並退出。在父項中,關閉管道的寫入結束並從讀取結束讀取。如果讀取0字節(EOF),則表示
exec
成功。如果您讀取管道中的一個字節,則表示exec
失敗。
在故障的情況下寫在管的數據可以被用於傳送錯誤的信息,如後exec
的errno
值。
代碼,錯誤檢查略去了,應該是這樣的:
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");
}
未能執行'exec',是否可以保證SIGCHLD信號將在EOF通知之前從孩子死亡關閉管道的事實中傳遞出來?我喜歡技術背後的想法;我只是想知道是否有比賽條件。 – 2013-03-19 11:05:07
@JonathanLeffler我不認爲有任何這樣的保證,但它不應該是必要的。如果'exec'失敗,通過管道發送一些數據很容易消除歧義。 – user4815162342 2013-03-19 11:29:52
@JonathanLeffler我現在編輯的答案不再依賴'SIGCHLD'。 – user4815162342 2013-03-19 11:32:10
- 1. 狀態返回ENOENT
- 2. Tomcat返回404狀態
- 3. 從域中返回狀態
- 4. Webpack返回狀態碼2
- 5. 返回進度狀態
- 6. 不能返回firstResponder狀態
- 7. mysqldump是否返回狀態?
- 8. PHP返回狀態0
- 9. 返回部分狀態
- 10. 返回代碼和狀態
- 11. 從MGTwitterEngine返回狀態
- 12. HttpUrlConnection返回-1狀態碼
- 13. PHP 401狀態返回-1
- 14. C或C++返回狀態
- 15. AppsFlyer返回狀態碼400
- 16. nsfdbopen返回535狀態
- 17. pjsua_call_make_call返回狀態450851
- 18. 返回按鈕返回到動態添加控件的狀態
- 19. 的MySQL返回從不同的狀態
- 20. android返回到活動狀態後恢復edittext的狀態
- 21. 從無狀態Bean返回有狀態的Java Bean?
- 22. Boost狀態圖:返回到以前的狀態
- 23. $ _ POST返回{ 「readyState的」:4, 「狀態」:200, 「狀態文本」: 「成功」}
- 24. Supertest沒有返回正確的狀態
- 25. GET HTTP狀態返回的ObjectDisposedException
- 26. 設置爲true的狀態返回false
- 27. emalloc的測試返回狀態
- 28. 詹金斯返回的狀態碼128
- 29. 多位集的返回狀態
- 30. VHDL FILE_OPEN不返回正確的狀態
這個鏈接可以幫助你http://stackoverflow.com/questions/13532391/how-to-get-error- of-execvp-in-the-fork – MOHAMED 2013-03-19 10:44:26
OP希望父級知道孩子的'exec'成功進行。可以通過多種方式(通過管道或特殊的退出狀態)向父節點報告「exec」失敗,但「exec」成功很難確認,因爲成功的'exec'定義意味着我們的進程不再運行。 – user4815162342 2013-03-19 10:53:25
@ user4815162342:用「* ...一個孩子的'exec' ... *」表示創建孩子本身的exec或由兒童完成的一個exec(這個轉變是由exec創建的'由父母)? – alk 2013-03-19 11:07:20