作者gn00618777 (非常念舊)
看板C_and_CPP
標題[問題] wait & waitpid
時間Tue Oct 26 23:54:23 2021
大家晚安
我有一段code
exe_command(cmd); //cmd 做 sed -i /server/d /etc/ntp.conf
...
...
...
exe_command(cmd) //cmd 做 echo server xxxx.xxx.xxx >> /etc/ntp.conf
用測試程式執行一兩次發現 ntp.conf 經常是空的,把前面 command 刪除則正常加入
但前面的command要保留不能刪除
看進去
exe_command:
pid = fork();
if(pid < 0) {}
else if(pid > 0) {
wait(&staus); //----->這邊改成waitpid(pid, &staus, 0)就可以解了
if(status) {
ERR(...);
return -1;
}
} else {
if(execvp(...) < 0)
exit(EXIT_FALURE);
exit(EXIT_SUCCESS);
}
這之間的差異是wait只要是任何一個子process結束後就會讓wait離開
waitpid 是要等待一個特定的子process結束才會離開
但還是想不透說是甚麼樣的timing這問題才會產生?
原本想說後面的子行程先執行才執行前面的,才會造成。但wait一定是block住才能
進行下一個command阿...
謝謝指教QQ
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 59.115.78.101 (臺灣)
※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1635263668.A.40E.html
推 Schottky: 此處要用 waitpid 才對 10/27 09:31
→ Schottky: 在 wait 之前有任何 unwaited child process 全部都會 10/27 09:34
→ Schottky: 算在 wait 頭上被接收,包括但不限於你列出來的部份code 10/27 09:35
→ Lipraxde: 收到各種 signal wait 都會跳出來,處理超麻煩的 10/28 21:12
→ gn00618777: 我這段改成waitpid()的func會造成許多zombie... 11/02 21:19