僵屍進程

来源:http://www.cnblogs.com/wuguiyunwei/archive/2017/06/20/7055864.html
-Advertisement-
Play Games

在UNIX系統中,僵屍進程是指完成執行(通過exit系統調用,或運行時發生致命錯誤或收到終止信號所致)但在操作系統的進程表中仍然有一個表項(進程式控制制塊PCB),處於”終止狀態“的進程。這發生於子進程需要保留表項以允許其父進程讀取子進程的exit status:一旦退出態通過wait系統調用讀取,僵屍 ...


 

 

 

在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所“收養”、清理。

例子:

 

 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 #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; }

我們的公共號

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 故障描述,重啟伺服器後,發現該重啟節點未成功加入到Windows群集中,導致該節點上的Alwayson服務也受影響處於“正在解析”狀態,嘗試重啟cluster服務,發現無效,查看windows日誌,發現以下錯誤: 發現以上錯誤均不是重點,重點是: 嘗試更新域控策略,也會有類似錯誤提示: 仔細對比了當 ...
  • 第一步:第一次打開MyEclipse,先從網上下載相應的驅動。(我的是mysql-connector-java-5.0.5-bin,視情況而定); 第二部:先打開MyEclipse Database Explorer透視圖,選擇MyEclipse菜單欄的Window/Open Perspective ...
  • ...
  • 1.mysql數據存儲結構 1.1由“資料庫”——》“表”——》“數據”組成 1.2管理資料庫需要使用SQL(結構化查詢語言) SQL語言分為: 1 數據查詢語言DQL 按照指定的組合、條件表達式或排序檢索已存在的資料庫中數據,不改變資料庫中數據。 命令:SELECT…FROM…WHERE… 2 數 ...
  • 系統環境:Win10 64位 MySQL版本:mysql-5.7.18-winX64 部署的步驟就是按照網上說的: 1:修改環境變數path,增加值D:\Program Files\MySQL\MySQL Server 5.7\bin 2:複製了一個舊版本mysql安裝目錄下的my.ini(網上說這 ...
  • 父進程 在電腦領域,父進程(英語:Parent Process)指已創建一個或多個子進程的進程。 UNIX 在UNIX里,除了進程0(即PID=0的交換進程,Swapper Process)以外的所有進程都是由其他進程使用系統調用fork創建的,這裡調用fork創建新進程的進程即為父進程,而相對應 ...
  • 0 這幾天剛來實驗室,拿到師兄的電腦後先裝系統,下麵簡單記錄一下歷程。 1 重裝系統:windows(Win7) 1.1 下載大白菜/老毛桃等工具,把U盤製作成啟動盤 1.2 下載windows系統鏡像文件放入U盤中 1.3 U盤插入待裝系統的主機,開機進入BIOS(不同電腦進入方式不同,通常是開機 ...
  • 這個標題夠直接了吧,夠坦誠了吧,也許你在項目里這三個東西都沒有用到,但這三個東西在未來的兩年裡將成為最HOT的技術,它們不是什麼框架,也不是什麼設計模式,而是做為程式和環境快速部署而設計出來的,為的就是解決未來超級複雜的開發環境的部署工作,對於這三個東西,大叔最近也在研究與實踐,並現時會總結出一些東 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...