導航:首頁 > 操作系統 > linux父進程子進程退出

linux父進程子進程退出

發布時間:2025-07-09 11:39:41

『壹』 在 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里,父進程退出了,子進程一定會退出嗎

不一定會。當父進程退出時,子進程的命運取決於子進程的狀態。如果子進程尚未完成其任務,則它不會立即終止。此時,init進程將接管子進程,成為其新的父進程。

有一種情況可以確保子進程隨父進程一起退出,那就是使用線程。在多線程環境中,當主線程結束時,所有未完成的子線程會自動終止。因此,如果父進程是主線程,其退出將導致所有子線程結束,進而使子進程終止。

另外一種方法是使用信號機制。父進程可以在其退出前發送一個信號給子進程,子進程接收到信號後,可以執行相應的處理邏輯,比如保存狀態或清理資源。這樣,子進程可以在接收到信號後選擇退出。

還有一種解決方案是利用atexit函數。在C/C++編程中,可以使用atexit注冊一個退出時執行的函數。父進程可以在退出前調用這個函數,函數中可以發送一個信號給子進程,促使子進程退出。

總結來說,雖然父進程退出不一定導致子進程立即退出,但通過上述方法可以實現子進程與父進程同步結束的目標。

『叄』 Linux進程後台運行的幾種方式

Ctrl+z/bg/nohup/setsid/&
在Linux中,如果要讓進程在後台運行,一般情況下,我們在命令後面加上&即可,實際上,這樣是將命令放入到一個作業隊列中了:

./rsync.sh &# jobs

但是如上方到後台執行的進程,其父進程還是當前終端shell的進程,而一旦父進程退出,則會發送hangup信號給所有子進程,子進程收到hangup以後也會退出。如果我們要在退出shell的時候繼續運行進程,則需要使用nohup忽略hangup信號,或者setsid將將父進程設為init進程(進程號為1):對於已經在前台執行的命令,也可以重新放到後台執行,首先按ctrl+z暫停已經運行的進程,然後使用bg命令將停止的作業放到後台運行:bg %1,放回前台運行:%1。
# nohup ./rsync.sh &# setsid ./rsync.sh &或
# (./rsync.sh &) ////在一個subshell中執行# ps -ef|grep rsync

nohup 的用途就是讓提交的命令忽略 hangup 信號,標准輸出和標准錯誤預設會被重定向到 nohup.out 文件中。。一般我們可在結尾加上」&」來將命令同時放入後台運行,也可用」 > log.out 2>&1」來更改預設的重定向文件名。
上面的試驗演示了使用nohup/setsid加上&使進程在後台運行,同時不受當前shell退出的影響。那麼對於已經在後台運行的進程,該怎麼辦呢?可以使用disown命令:
# jobs
# disown -h %1# ps -ef|grep rsync

效果與setid相同,但是disown後無法通過jobs命令查看了。
screen
還有一種更加強大的方式是使用screen,首先創建一個斷開模式的虛擬終端,然後用-r選項重新連接這個虛擬終端,在其中執行的任何命令,都能達到nohup的效果,這在有多個命令需要在後台連續執行的時候比較方便。

GNU Screen是一款由GNU計劃開發的用於命令行終端切換的自由軟體。用戶可以通過該軟體同時連接多個本地或遠程的命令行會話,並在其間自由切換,可以看作是窗口管理器的命令行界面版本。它提供了統一的管理多個會話的界面和相應的功能。
# yum install screen -y

常用screen參數:
# screen -S docker-d 新建一個名叫docker-d的session,並馬上進入
# screen -dmS docker-d 新建一個名叫docker-d的session,但暫不進入,可用於系統啟動腳本里
# screen -ls 列出當前所有session
# screen -r docker-d 恢復到zhouxiao這個session,前提是已經是斷開狀態(-d可以遠程斷開會話)
# screen -x docker-d 連接到離線模式的會話(多窗口同步演示)
# screen ./rsync.sh screen創建一個執行腳本的單窗口會話,可以attach進程ID
# screen -wipe 檢查目前所有的screen作業,並刪除已經無法使用的screen作業

正常情況下,當你退出一個窗口中最後一個程序(通常是bash)後,這個窗口就關閉了。另一個關閉窗口的方法是使用C-a k,這個快捷鍵殺死當前的窗口,同時也將殺死這個窗口中正在運行的進程。
在每個screen session 下,所有命令都以 ctrl+a(C-a) 開始。
C-a w 顯示所有窗口列表
C-a k 這個快捷鍵殺死當前的窗口,同時也將殺死這個窗口中正在運行的進程。
C-a d detach,暫時離開當前session

上面只是基本也是最常用的用法,更多請參考man screen或linux screen 命令詳解。需要了解的是,一個用戶創建的screen,其他用戶(甚至root)通過screen -ls是看不見的。另外,Ctrl+a在bash下是用來回到行開頭,不幸與上面的組合快捷鍵沖突。

閱讀全文

與linux父進程子進程退出相關的資料

熱點內容
杭州it程序員對身體好不好 瀏覽:533
高新區編程加盟找哪家 瀏覽:22
伺服器什麼樣的好賣 瀏覽:140
單片機原理及應用第二版例題答案 瀏覽:960
base64encoderjava 瀏覽:482
linux視頻轉換 瀏覽:696
linux與unixshell編程指南 瀏覽:133
vb6反編譯程序錯誤 瀏覽:121
伺服器弄掛有什麼影響 瀏覽:302
安卓軟體為什麼運行不了 瀏覽:526
什麼安卓手機是四方的 瀏覽:477
雲伺服器廠商租用多少錢 瀏覽:353
平安車貸解壓要多久 瀏覽:416
樂一php程序員待遇 瀏覽:164
ZDM命令無法識別 瀏覽:922
解壓小手工A4紙 瀏覽:983
鋼筋加密區是幾倍 瀏覽:671
編譯程序代碼軟體 瀏覽:808
怎麼恢復加密的東西 瀏覽:989
程序員賣茶 瀏覽:700