最近遇到很奇怪的情形, 就是通常parent process fork child process之後, 要不parent process必須waitpid 去等待child process結束, 不然就是你必須在parent process上面註冊SIGCHLD 的signal handler (這個SIGCHLD會在child process terminated的時候發送給parent process), 結果我在parent process當中居然waitpid return -1, 訊息是no child process! 所以猜測parent process在還沒有執行到waitpid的時候, child process就結束了
所以稍微寫了小程式測試
- version1: vfork + execv with no signal handler (parent process 在執行waitpid前先sleep)
- waitpid return 0, WEXITSTATUS(status)可以正常拿到child process exit code
- version1: vfork + execv with SIGCHLD signal handler (parent process 在執行waitpid前先sleep)
- waitpid return -1, no child process, WEXITSTATUS(status)拿不到child process exit code
- version1: vfork + execv with ignore SIGCHLD signal(parent process 在執行waitpid前先sleep)
- waitpid return -1, no child process, WEXITSTATUS(status)拿不到child process exit code
所以最後問題在於只要你有註冊SIGCHILD相關處理, 就無法拿到child process exit code!
另外還有一種情形, 在linux system call的時候, 有甚饃會被系統interrupt, 這時候通常的解法就是retry~
http://book.chinaunix.net/special/ebook/addisonWesley/APUE2/0201433079/ch10lev1sec5.html
沒有留言:
張貼留言