Linux 僵死進程

fork復制進程之后,會產生一個進程叫做子進程,被復制的進程就是父進程。不管父進程先結束,還是子進程先結束,對另外一個進程完全沒有影響,父進程和子進程是兩個不同的進程。

一、孤兒進程

現在有以下代碼:

在這里插入圖片描述

【注意】
上述代碼中,調用getpid()輸出當前進程的pid,調用getppid()輸出當前進程的父進程的pid。

讓子進程執行7次,父進程執行3次,編譯并運行,結果如下:

在這里插入圖片描述

分析:當父進程執行完3次之后,子進程的父進程結束,子進程就變為了孤兒進程,孤兒進程會被系統中的inti(pid=1)收養,但是在目前有些系統中,也會被隨機的其他進程收養。例如,上圖中,父進程執行完3次之后,父進程結束,子進程就變為了孤兒進程,該孤兒進程的父進程的id就變成了1145,說明該孤兒進程的父進程變為了pid為1145的一個進程。

二、僵死進程

僵死進程:子進程先與父進程結束,父進程沒有獲取子進程的退出碼,子進程就變成了僵死進程。

有以下代碼:

在這里插入圖片描述

編譯以上代碼,并在后臺運行,運行的時候通過ps查看進程信息,結果如下:

在這里插入圖片描述

分析:

由結果可以看出當子進程結束之后,通過ps查看進程信息的時候還是可以看到子進程的信息,只不過子進程后邊加了一個注釋<defunct>,表示該子進程變成了僵死進程,僵死進程就是表示代碼已經結束了,是已經結束的進程,這個進程在以后再也不會執行了。按道理子進程在結束了之后不應該還能看到這個進程,也就是說這個子進程本來應該已經死掉了,但是我們還能看到它,這是不合理的。

我們之所以還能看到這個子進程(僵死進程),是因為子進程比父進程先結束,父進程沒有獲取子進程的退出碼,該子進程就變成了僵死進程。

所謂退出碼是存放到PCB中的,當子進程結束之后如果父進程沒有獲取子進程的退出碼,那么子進程的PCB就不會消失,會一直存在,所以在子進程結束之后再查看進程信息的時候就還能看到子進程的信息,但是這個子進程已經是僵死進程了。如果一個進程不斷產生子進程,子進程結束后也沒有獲取子進程的退出碼,那么這些子進程就會變成僵死進程僵死進程就會越來越多,那么內核空間的內存就會被逐漸耗光,而且僵死進程會占用著PID不釋放,那么這個PID就無法被復用,軟件層面的資源也被占著。

三、處理僵死進程

父進程獲取子進程的退出碼,僵死進程就會消失。這一步要通過父進程調用wait()來完成。wait()可以獲取子進程的退出碼,處理僵死進程。

代碼如下:

在這里插入圖片描述

運行結果如下:

①在前臺運行:

在這里插入圖片描述
根據運行結果可以看出,一開始只有子進程在執行,因為父進程中執行了wait,子進程執行的時候由于wait阻塞住了父進程,子進程執行結束之后,父進程才開始執行,也就是說父進程在等待子進程結束。

代碼中可以看到無論父進程還是子進程退出碼的值都為3,但是運行結果中val的值并不是3,而是768,這是因為int型變量占4個字節,將3換算為二進制數之后為11,這個11并不會存在第一個字節的起始位置,而是會在4個字節中的任意位置。如下圖所示,把768轉換為二進制數為0011 0000 0000:

在這里插入圖片描述

將val的值向右移動8個位,將代碼中的printf("val=%d\n",val);改為printf("val=%d\n",val>>8);之后,再編譯運行,val的值的結果就是3了,如下圖所示:

在這里插入圖片描述

②在后臺運行

運行結果:

在這里插入圖片描述

作為父進程要關注有自己產生的子進程,不能讓它們變為僵死進程。

如果父進程比子進程先結束,父進程沒有通過wait處理結束的子進程,子進程變為了僵死進程,等到父進程結束以后,此時不管子進程活著還是死掉了,就會給子進程重新找一個父進程,讓這個另外的進程來收養子進程,另外的進程來收養子進程的意義就在于這個收養子進程的父進程就會接管這個子進程,然后執行wait獲取該子進程的退出碼,那么即便收養的子進程已經結束變成了僵死進程,通過收養它的父進程來執行wait,這個僵死進程就消失了。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/42766.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/42766.shtml
英文地址,請注明出處:http://en.pswp.cn/news/42766.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何計算全彩LED顯示屏的像素

大屏尺寸 提供大屏的尺寸和像素點間距&#xff0c;計算大屏的分辨率是多少&#xff1f; 大屏尺寸&#xff1a;寬度>10200mm&#xff0c;高度>2025mm&#xff1b;像素點間距<1.25mm 分辨率計算 寬10200/1.258160px 高2025/1.251620px 寬&#xff1a;高 接近 5:1&a…

PHP 三元 !empty 而不是評估為真或假 可用isset()

是否可以使用速記三元來檢查變量是否已設置&#xff0c;而不是是否計算結果為零或非零&#xff1f; 例如&#xff0c;我試過&#xff1a; $var 0; echo (string) $var ?: (string) false ?: 2;但由于前兩個表達式的計算結果均為“0”或“false”&#xff0c;因此顯示為 2。…

如何建立單元測試

快速開始 zixun-quickstart-mk3生成的項目已經配置好了基礎的BaseTest,各個測試類只需要繼承BaseTest就可以開始進行單元測試的編寫了。 如何進行Mock 為了保證獨立性和可重復執行,所有的外部依賴都需要進行Mock,SpringTest引入了Mockito作為單測Mock組件, Mickito官方文…

vue2中使用unocss,在ie11 不能正常顯示unocss的顏色設置

前景 ie11 不能正常顯示unocss的顏色設置&#xff1a;“–un-text-opacity: 1 !important; color: rgba(213,147,197,var(–un-text-opacity));” IE11 目前是無法支持 CSS 變量&#xff08;自定義屬性&#xff09;和 rgba 中使用的 var() 函數。 為了在 IE11 中使用 UnoCSS…

前端基礎(JavaScript語法)

前言&#xff1a;今天學習JavaScript的基本語法&#xff0c;包括變量、函數、對象、數組。 目錄 JavaScript 變量 函數 對象 數組 JavaScript 變量 定義變量 判斷語句 判斷等于&#xff1a; 判斷不等于&#xff1a;! if else語句 if(vavb){ console.log("…

springboot 整合swagger 入門 使用

1.前提 一定要看好版本。 Springboot ? Swagger各版本整理_swagger版本_qq_33334411的博客-CSDN博客 我的版本: <dependency><groupId>io.springfox</groupId><artifactId>springfox-boot-starter</artifactId><version>3.0.0</ver…

前饋神經網絡正則化例子

直接看代碼&#xff1a; import torch import numpy as np import random from IPython import display from matplotlib import pyplot as plt import torchvision import torchvision.transforms as transforms mnist_train torchvision.datasets.MNIST(root…

Docker:Windows container和Linux container

點擊"Switch to Windows containers"菜單時&#xff1a; 提示 然后 實際上是運行&#xff1a;com.docker.admin.exe start-service

成集云 | 樂享問題邀請同步企微提醒 | 解決方案

源系統成集云目標系統 方案介紹 騰訊樂享是騰訊公司開發的一款企業社區化知識管理平臺&#xff0c;它提供了包括知識庫、問答、課堂、考試、活動、投票和論壇等核心應用。這個平臺凝聚了騰訊10年的管理經驗&#xff0c;可以滿足政府、企業和學校在知識管理、學習培訓、文化建…

【gitkraken】gitkraken自動更新問題

GitKraken 會自動升級&#xff01;一旦自動升級&#xff0c;你的 GitKraken 自然就不再是最后一個免費版 6.5.1 了。 在安裝 GitKraken 之后&#xff0c;在你的安裝目錄&#xff08;C:\Users\<用戶名>\AppData\Local\gitkraken&#xff09;下會有一個名為 Update.exe 的…

Linux環境變量

環境變量 一.基本概念二.常見的環境變量1.PATH&#xff1a;指令搜索路徑2.HOME&#xff1a; 指定用戶的主工作目錄3.SHELL&#xff1a;當前Shell,它的值通常是/bin/bash 三.查看環境變量的方法四.命令行參數五.環境變量增加和刪除六.本地變量 一個問題&#xff1a;我們在寫一段…

Kotlin~Bridge橋接模式

概念 抽象和現實之間搭建橋梁&#xff0c;分離實現和抽象。 抽象&#xff08;What&#xff09;實現&#xff08;How&#xff09;用戶可見系統正常工作的底層代碼產品付款方式定義數據類型的類。處理數據存儲和檢索的類 角色介紹 Abstraction&#xff1a;抽象 定義抽象接口&…

《Go 語言第一課》課程學習筆記(五)

入口函數與包初始化&#xff1a;搞清 Go 程序的執行次序 main.main 函數&#xff1a;Go 應用的入口函數 Go 語言中有一個特殊的函數&#xff1a;main 包中的 main 函數&#xff0c;也就是 main.main&#xff0c;它是所有 Go 可執行程序的用戶層執行邏輯的入口函數。 Go 程序在…

一起創建Vue腳手架吧

目錄 一、安裝Vue CLI1.1 配置 npm 淘寶鏡像1.2 全局安裝1.3 驗證是否成功 二、創建vue_test項目2.1 cmd進入桌面2.2 創建項目2.3 運行項目2.4 查看效果 三、腳手架結構分析3.1 文件目錄結構分析3.2 vscode終端打開項目 一、安裝Vue CLI CLI&#xff1a;command-line interface…

日常BUG——微信小程序提交代碼報錯

&#x1f61c;作 者&#xff1a;是江迪呀??本文關鍵詞&#xff1a;日常BUG、BUG、問題分析??每日 一言 &#xff1a;存在錯誤說明你在進步&#xff01; 一、問題描述 在使用微信小程序開發工具進行提交代碼時&#xff0c;報出如下錯誤&#xff1a; Invalid a…

Git提交規范指南

在開發過程中&#xff0c;Git每次提交代碼&#xff0c;都需要寫Commit message&#xff08;提交說明&#xff09;&#xff0c;規范的Commit message有很多好處&#xff1a; 方便快速瀏覽查找&#xff0c;回溯之前的工作內容可以直接從commit 生成Change log(發布時用于說明版本…

5、flink任務中可以使用哪些轉換算子(Transformation)

1、什么是Flink中的轉換算子 在使用 Flink DataStream API 開發流式計算任務時&#xff0c;可以將一個或多個 DataStream 轉換成新的 DataStream&#xff0c;在應用程序中可以將多個數據轉換算子合并成一個復雜的數據流拓撲圖。 2、常用的轉換算子 Flink提供了功能各異的轉換算…

[論文筆記]ON LAYER NORMALIZATION IN THE TRANSFORMER ARCHITECTURE

引言 這是論文ON LAYER NORMALIZATION IN THE TRANSFORMER ARCHITECTURE的閱讀筆記。本篇論文提出了通過Pre-LN的方式可以省掉Warm-up環節,并且可以加快Transformer的訓練速度。 通常訓練Transformer需要一個仔細設計的學習率warm-up(預熱)階段:在訓練開始階段學習率需要設…

JDK 1.6與JDK 1.8的區別

ArrayList使用默認的構造方式實例 jdk1.6默認初始值為10jdk1.8為0,第一次放入值才初始化&#xff0c;屬于懶加載 Hashmap底層 jdk1.6與jdk1.8都是數組鏈表 jdk1.8是鏈表超過8時&#xff0c;自動轉為紅黑樹 靜態方式不同 jdk1.6是先初始化static后執行main方法。 jdk1.8是懶加…

設置PHP的fpm的系統性能參數pm.max_children

1 介紹 PHP從Apache module換成了Fpm&#xff0c;跑了幾天突然發現網站打不開了。 頁面顯示超時&#xff0c;檢查MySQL、Redis一眾服務都正常。 進入Fpm容器查看日志&#xff0c;發現了如下的錯誤信息&#xff1a; server reached pm.max_children setting (5), consider r…