導航:首頁 > 編程系統 > linux父進程等待子進程結束

linux父進程等待子進程結束

發布時間:2023-09-03 20:58:28

linux裡面的父進程等待子進程問題..

  1. 父進程只等待任何一個進程狀態改變,wait就會立即返回.並攜帶狀態改變的子進程信息專.如果需要等屬待所有進程結束,可以wait外面套循環.

  2. 如果子進程結束後父進程才調用wait/waitpid則不會接收到信息.子進程將變成僵屍進程.

⑵ 在 linux中如何結束由一個父進程產生的所有子進程

父進程未結束,子進程先結束,會產生僵屍進程。
子進程在調用exit命令結束自己的生命的時候,其實它並沒有真正的被銷毀,而是留下一個稱為僵屍進程(Zombie)的數據結構(系統調用 exit,它的作用是使進程退出,但也僅僅限於將一個正常的進程變成一個僵屍進程,並不能將其完全銷毀)。
即使是root身份kill -9也不能殺死僵屍進程。補救辦法是殺死僵屍進程的父進程(僵屍進程的父進程必然存在),僵屍進程成為"孤兒進程",過繼給1號進程init,init始終會負責清理僵屍進程。
僵屍進程的避免:
(1) 父進程通過wait和waitpid等函數等待子進程結束,這會導致父進程掛起。
(2) 如果父進程很忙,那麼可以用signal函數為SIGCHLD安裝handler,因為子進程結束後, 父
進程會收到該信號,可以在handler中調用wait回收。
(3) 如果父進程不關心子進程什麼時候結束,那麼可以用signal(SIGCHLD, SIG_IGN) 通知內
核,自己對子進程的結束不感興趣,那麼子進程結束後,內核會回收, 並不再給父進程發送
信號。
(4) 還有一些技巧,就是fork兩次,父進程fork一個子進程,然後繼續工作,子進程fork一 個孫進
程後退出,那麼孫進程被init接管,孫進程結束後, init會回收。不過子進程的回收 還要自己
做。
建議你使用第三種方法,父進程直接忽略子進程的結束,留給內核作回收處理。這樣就不
會產生僵屍進程。

⑶ linux下system函數調用shell命令後,怎樣讓主進程等子進程返回後,接著執行

這是進程間同步的問題。解決方法是:fork一個子進程執行system調用,父進程調用 wait 或 waitpid 等待子進程的終止信息。

父進程調用 wait 或 waitpid 時可能會:
• 阻塞(如果它的所有子進程都還在運行)。
• 帶子進程的終止信息立即返回(如果一個子進程已終止,正等待父進程讀取其終止信息)。
• 出錯立即返回(如果它沒有任何子進程)。

wait 和 waitpid 這兩個函數的區別是:
• 如果父進程的所有子進程都還在運行,調用wait將使父進程阻塞,而調用waitpid時如果在options參數中指定WNOHANG可以使父進程不阻塞而立即返回0。
• wait等待第一個終止的子進程,而waitpid可以通過pid參數指定等待哪一個子進程。

⑷ Linux 如何使用`wait`等待所有子進程退出,而不是等待第一個子進程退出.希望能給出代碼片段

linux中的wait函數等到一個子進程退出就會返回,恢復到執行狀態。要想等所有子進程專退出可以用waitpid函數
pid_t wait(pid_t pid,int * status,int options);
pid>0時,屬只等待pid與該參數相同的子進程,如果該子進程一直沒有退出,那麼父進程會一直阻塞;
pid=0時,會等待同一個進程組的子進程,若子進程加入了其他進程組,waitpid()不再關心它的狀態;
pid=-1時,waitpid()與wait()函數相同,將阻塞等待並回收一個子進程;
pid<-1時,會等待指定進程組的任何子進程,進程組的id等於pid的絕對值;

⑸ linux編程wait(0)放在最後一句有什麼用

wait是等待,等待前面的所有子進程全部執行完才繼續。這里p1=fork(),p2=fork()不是有調用到fork子進程嗎
寫這個的回目的是避免上面答的還沒執行完就開始執行後續的程序了。
我舉個例子,你在執行備份後刪除原文件操作,備份還沒進行完,程序就開始刪除了。這樣就會出錯了。
當然你這里後續沒有操作,wait只是在等待上面的全部做完然後退出整個程序。

⑹ linux裡面的父進程等待子進程問題..

1.
父進程只等待任何一個進程狀態改變,wait就會立即返回.並攜帶狀態改變的子進程信息.如果需要等待所有進程結束,可以wait外面套循環.
2.
如果子進程結束後父進程才調用wait/waitpid則不會接收到信息.子進程將變成僵屍進程.

⑺ Linux中啟動進程的方法有哪些哪種更好用

啟動進程有手動啟動和調度啟動兩種方法, 其中調度啟動常用的命令為at、batch和crontab.,好用不好用我覺得都差不多~ 調度啟動吧!希賽資料庫里有的噢

⑻ Linux C中父進程退出時,使用什麼方法可使子進程退出

發信號,抄kill(子進程ID, SIG信號)
如果不只一個襲子進程,需要把所有的子進程ID存起來,然後用上述方法一個一個的kill
SIG信號需要能使子進程退出,如SIGQUIT,SIGINT...等一些默認的信號;也可以在子進程中捕獲某些信號,然後子進程收到後自己退出
注意:最好是在子進程退出時,父進程要等待所有子進程退出

閱讀全文

與linux父進程等待子進程結束相關的資料

熱點內容
如何用金山毒霸切斷網路連接 瀏覽:873
怎麼設置文件打開密碼怎麼設置 瀏覽:5
網路小說用什麼寫 瀏覽:956
擴展名為rm的文件如何打開 瀏覽:707
導入android項目沒有rjava 瀏覽:899
帶英文和數字的文件名 瀏覽:843
黃山數控編程培訓在哪裡 瀏覽:111
win10俠盜5無限讀取 瀏覽:557
js工廠模式 瀏覽:927
iphone6s清理緩存 瀏覽:465
ug編程怎麼選不上字體 瀏覽:435
pc文件加密哪個好 瀏覽:393
蘋果軟體更新4位密碼 瀏覽:96
手機如何將文件弄成文件夾 瀏覽:275
swordigo第四關 瀏覽:996
t420win10網卡驅動 瀏覽:805
ps怎麼打開dxf文件怎麼打開 瀏覽:698
ps格式文件打開軟體 瀏覽:371
下載網路資源遇到哪些問題 瀏覽:887
抖音交友app廣告怎麼投 瀏覽:870

友情鏈接