日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

僵尸进程是什么意思?

發布時間:2023/12/15 综合教程 58 生活家
生活随笔 收集整理的這篇文章主要介紹了 僵尸进程是什么意思? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


在UNIX系統中,僵尸進程是指完成執行(通過exit系統調用,或運行時發生致命錯誤或收到終止信號所致)但在操作系統的進程表中仍然有一個表項(進程控制塊PCB),處于”終止狀態“的進程。這發生于子進程需要保留表項以允許其父進程讀取子進程的exit status:一旦退出態通過wait系統調用讀取,僵尸進程條目就從進程表中刪除,稱之為”回收(reaped)”。正常情況下,進程直接被其父進程wait并由系統回收。進程長時間保持僵尸狀態一般是錯誤的并導致資源泄漏。

英文術語zombie process源自en:zombie — 不死之人,隱喻子進程已死但仍然沒有被收割。與正常進程不同,kill命令對僵尸進程無效。孤兒進程不同于僵尸進程,其父進程已經死掉,但孤兒進程仍能正常執行,但并不會變為僵尸進程,因為被init(進程ID號為1)收養并wait其退出。

子進程死后,系統會發送SIGCHLD 信號給父進程,父進程對其默認處理是忽略。如果想響應這個消息,父進程通常在SIGCHLD 信號事件處理程序中,使用wait系統調用來響應子進程的終止。

僵尸進程被收割后,其進程號(PID)與在進程表中的表項都可以被系統重用。但如果父進程沒有調用wait,僵尸進程將保留進程表中的表項,導致了資源泄漏。某些情況下這反倒是期望的:父進程創建了另外一個子進程,并希望具有不同的進程號。如果父進程通過設置事件處理函數為SIG_IGN顯式忽略SIGCHLD信號,而不是隱式默認忽略該信號,或者具有SA_NOCLDWAIT標志,所有子進程的退出狀態信息將被拋棄并且直接被系統回收。

UNIX命令ps列出的進程的狀態(”STAT”)欄標示為 “Z“則為僵尸進程。

收割僵尸進程的方法是通過kill命令手工向其父進程發送SIGCHLD信號。如果其父進程仍然拒絕收割僵尸進程,則終止父進程,使得init進程收養僵尸進程。init進程周期執行wait系統調用收割其收養的所有僵尸進程。

為避免產生僵尸進程,實際應用中一般采取的方式是:

  1. 將父進程中對SIGCHLD信號的處理函數設為SIG_IGN(忽略信號);

  2. fork兩次并殺死一級子進程,令二級子進程成為孤兒進程而被init所“收養”、清理。

例子:

12345678910111213141516171819202122 #include <sys/wait.h>#include <stdlib.h>#include <unistd.h> int main(void){ pid_t pids[10]; int i; for (i = 9; i >= 0; --i) { pids[i] = fork(); if (pids[i] == 0) { sleep(i+1); _exit(0); } } for (i = 9; i >= 0; --i) waitpid(pids[i], NULL, 0); return 0;}

以上就是僵尸進程是什么意思?的詳細內容,更多請關注風君子博客其它相關文章!

總結

以上是生活随笔為你收集整理的僵尸进程是什么意思?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。