Linux_進程退出與進程等待

一、進程退出

  1. ?退出場景?

    • ?正常終止?:代碼執行完畢且結果符合預期(退出碼為?0)。
    • ?異常終止?:運行結果錯誤(退出碼非?0)或進程被信號強制終止。(如?SIGINT?或?SIGSEGV)。
  2. ?退出方法?

    • ?正常退出方式?:
      • return:從?main?函數返回,隱含調用?exit?函數。
      • exit(int status):標準庫函數,執行清理操作(如刷新緩沖區、調用?atexit?注冊的函數)后終止進程。
      • _exit(int status):系統調用,直接終止進程,不刷新緩沖區。? ? ??

exit函數和_exit函數的區別

_exit? :立即終止進程,不執行任何清理操作

exit? ?:? 調用清理函數、刷新緩沖區后終止進程

二、進程等待?

為什么要有進程等待?

父進程在忙,子進程結束了,但無人回收,這樣就造成了“死亡”的子進程一直占用資源

這個時候的子進程被稱為“僵尸進程”

為了解決這個問題,最初的思路是:讓父進程停下,等待子進程執行完,然后回

  1. ?

    • ?回收資源?:子進程退出后若未回收,將殘留?task_struct?結構(僵尸進程)。
    • ?獲取狀態?:父進程需通過等待機制獲取子進程的退出碼或異常信號。

1、wait?函數參數解析?

pid_t wait(int *status);  

參數說明?

  • ?status?:
    • 類型為?int*,是輸出型參數,用于接收子進程的終止狀態(如退出碼或終止信號)。
    • 若不關心子進程狀態,可設為?NULL(如?wait(NULL)

返回值?

  • 成功時返回終止的子進程 pid;
  • 無子進程或調用失敗時返回

2、waitpid?函數參數詳解?

pid_t waitpid(pid_t pid, int *status, int options); 
  1. ?參數說明?
    • ?pid?:
      • ?> 0?:等待指定 pid?的子進程;
      • ?-1?:等待任意子進程(等價于?wait);
      • ?0?:等待與調用進程同進程組的所有子進程;
      • ?< -1?:等待進程組 ID 為?|pid|?的任意子進程。
    • ?status?:
      • 同?wait?的?status?參數,存儲子進程終止狀態。
    • ?options?:
      • ?0?:默認阻塞模式;
      • ?WNOHANG?:非阻塞模式,若指定子進程未結束則立即返回?0
      • ?WUNTRACED?:支持作業控制,返回已暫停的子進程狀態。
  2. ?返回值?
    • 成功時返回子進程 pid;
    • 若使用?WNOHANG?且無子進程終止,返回?0
    • 錯誤時返回?-1

waitpid?函數第二個參數詳解

waitpid?函數的第二個參數?int *status?是用于接收子進程終止狀態的關鍵參數,需配合特定宏解析具體信息。以下是詳細說明:

tatus不能簡單的當作整型來看,要從二進制的角度來看,32位下,整型轉化為二進制有32個bit位,但是我們僅關注低16位

?正常退出?(子進程調用?exit?或?_exit):

if (WIFEXITED(status)) {  int exit_code = WEXITSTATUS(status);  // 提取低8位退出碼(取值范圍0~255):ml-citation{ref="2,4" data="citationList"}  
}  

?信號終止?(子進程被信號殺死):?

if (WIFSIGNALED(status)) {  int signal_num = WTERMSIG(status);    // 提取終止信號編號(如 SIGKILL=9):ml-citation{ref="4,7" data="citationList"}  printf("Terminated by signal: %d\n", signal_num);  
}  

?暫停狀態?(需配合?WUNTRACED?選項):?

if (WIFSTOPPED(status)) {  int stop_signal = WSTOPSIG(status);   // 提取暫停信號編號(如 SIGSTOP=19):ml-citation{ref="4,7" data="citationList"}  
}  

status?的二進制位分布:??

?

?

  • WIFEXITED(status):判斷子進程是否正常退出(返回非零值時表示正常退出)。
  • WEXITSTATUS(status):若子進程正常退出,通過此宏獲取子進程的退出碼(如?exit(5)?中的?5)。
  • WIFSIGNALED(status):判斷子進程是否因信號終止(返回非零值時表示被信號終止)。
  • WTERMSIG(status):若子進程因信號終止,通過此宏獲取信號代碼(如?SIGKILL?對應?9

??可忽略性?
若父進程不關心子進程狀態,可將參數設為?NULL,此時僅等待子進程結束而不獲取狀態信息?

?

關鍵細節?

  • ?指針的必要性?:必須傳遞地址(如?&status),操作系統需要寫入狀態值到該地址。
  • ?狀態位結構?:status?的整數值包含多個信息位,需通過宏函數按需提取。
  • ?與?wait?的關系?:wait(&status)?等價于?waitpid(-1, &status, 0),二者的?status?解析方式一致

?

?

?

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

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

相關文章

GD32F407單片機開發入門(二十八)USB口介紹及CDC類虛擬串口通訊詳解及源碼

文章目錄 一.概要二.USB2.0基本介紹及虛擬串口介紹三.GD32單片機USB模塊框圖四.GD32單片機USB設備模式五.GD32F407VET6 USB設備CDC類六.配置一個USB虛擬串口收發例程七.工程源代碼下載八.小結 一.概要 GD32F407VET6USB虛擬串口是一種采用GD32F407VET6單片機&#xff0c;通過US…

MySQL 主從配置超詳細教程

文章目錄 前言一、安裝 MySQL二、主服務器&#xff08;Master&#xff09;配置三、從服務器&#xff08;Slave&#xff09;配置四、測試主從復制五、注意事項 前言 MySQL 主從配置是一種實用的數據庫架構&#xff0c;主服務器處理寫入操作&#xff0c;從服務器負責只讀操作&am…

Python爬蟲實戰:獲取百度學術專題文獻數據并分析,為讀者課題研究做參考

一、引言 在信息爆炸的當下,學術研究需要大量相關資料支撐。百度學術作為重要學術資源平臺,蘊含豐富學術文獻。利用爬蟲技術獲取百度學術特定主題文章數據,能為學術研究提供全面、及時信息。本研究旨在用 Python 實現對百度學術 “主題爬蟲” 相關文章的爬取,并對數據深入…

手撕基于AMQP協議的簡易消息隊列-6(服務端模塊的編寫)

在MQServer中編寫服務端模塊代碼 在MQServer中編寫makefile文件來編譯服務端模塊 .PHONY: server CFLAG -I../ThirdLib/lib/include LFLAG -L../ThirdLib/lib/lib -lgtest -lprotobuf -lsqlite3 -pthread -lmuduo_net -lmuduo_base -lz server:server.cpp ../MQCommon/messag…

linux tar命令詳解。壓縮格式對比

1.壓縮格式對比 壓縮格式命令選項文件擴展名壓縮率速度無壓縮-cvf.tar無最快gzip-czvf.tar.gz中等較快bzip2-cjvf.tar.bz2較高較慢xz-cJvf.tar.xz最高最慢 9. 更多參考 【Linux基礎】文件壓縮tar命令指南tar壓縮方式對比

解鎖跨平臺開發的新時代——Compose Multiplatform

解鎖跨平臺開發的新時代——Compose Multiplatform 在當今移動和桌面應用程序開發領域,跨平臺解決方案是開發者們夢寐以求的工具。而由JetBrains打造的Compose Multiplatform正是這樣一款現代UI框架,它基于Kotlin技術,為開發者構建高性能且美觀的用戶界面提供了極大的便利和…

【算法學習】遞歸、搜索與回溯算法(二)

算法學習&#xff1a; https://blog.csdn.net/2301_80220607/category_12922080.html?spm1001.2014.3001.5482 前言&#xff1a; 在&#xff08;一&#xff09;中我們挑了幾個經典例題&#xff0c;已經對遞歸、搜索與回溯算法進行了初步講解&#xff0c;今天我們來進一步講解…

HTTP請求與緩存、頁面渲染全流程

文章目錄 前言**1. HTTP請求與緩存處理****緩存機制**? 強緩存&#xff08;Cache-Control / Expires&#xff09;? 協商緩存&#xff08;Last-Modified / ETag&#xff09; **2. 服務器響應與數據解析****3. HTML DOM 構建****4. CSSOM 構建****5. 渲染樹&#xff08;Render …

限流算法學習筆記(一)Go Rate Limiter

文章目錄 1. 背景與概述1.1 什么是速率限制1.2 Go Rate Limiter 的定義與價值 2. 核心思想與設計理念2.1 令牌桶算法的基本原理2.2 惰性評估設計2.3 多種處理策略的平衡2.4 簡單易用的偶發控制 3. 架構設計與組件3.1 整體架構3.2 Limiter 組件3.3 Reservation 組件3.4 Limit 類…

n8n工作流自動化平臺的實操:生成統計圖的兩種方式

1.成果展示 1.1n8n的工作流 牽涉節點&#xff1a;Postgres、Code、QuickChart、Edit Fields、HTTP Request 12.顯示效果 2.實操過程 2.1節點說明 2.1.1Postgres節點&#xff1a; 注&#xff1a;將明細數據進行匯總。 2.1.2code節點&#xff1a; 注&#xff1a;將 查詢的數…

JavaScript中數組和對象不同遍歷方法的順序規則

在JavaScript中&#xff0c;不同遍歷方法的順序規則和適用場景存在顯著差異。以下是主要方法的遍歷順序總結&#xff1a; 一、數組遍歷方法 for循環 ? 嚴格按數組索引順序遍歷&#xff08;0 → length-1&#xff09; ? 支持break和continue中斷循環 ? 性能最優&#xff0c;…

緩存(1):三級緩存

三級緩存是指什么 我們常說的三級緩存如下&#xff1a; CPU三級緩存Spring三級緩存應用架構&#xff08;JVM、分布式緩存、db&#xff09;三級緩存 CPU 基本概念 CPU 的訪問速度每 18 個月就會翻 倍&#xff0c;相當于每年增? 60% 左右&#xff0c;內存的速度當然也會不斷…

Android setContentView()源碼分析

文章目錄 Android setContentView()源碼分析前提setContentView() 源碼分析總結 Android setContentView()源碼分析 前提 Activity 的生命周期與 ActivityThread 相關&#xff0c;調用 startActivity() 時&#xff0c;會調用 ActivityThread#performLaunchActivity()&#xf…

uniapp自定義步驟條(可二開進行調試)

前言 有一個業務需求是需要一個步驟條&#xff0c;但是發現開源的都不太合適&#xff0c;所以就自己寫了一個。 開始 test.vue <template><view class"authenticateRecordDetails_container"><!-- 進度 --><view class"authenticateSte…

22、近端策略優化算法(PPO)論文筆記

近端策略優化算法&#xff08;PPO&#xff09;論文筆記 一、研究背景與目標二、**方法****3.1 策略梯度基礎****3.2 信任區域方法&#xff08;TRPO&#xff09;****3.3 剪切代理目標函數&#xff08;LCLIP&#xff09;****3.4 自適應KL懲罰系數****3.5 算法實現** 三、 L CLIP…

web 自動化之 Selenium 元素定位和瀏覽器操作

文章目錄 一、元素定位的八大方法1、基于 id/name/class/tag_name 定位2、基于 a 標簽元素的鏈接文本定位3、基于xpath定位4、css定位 二、瀏覽器操作1、信息獲取2、 瀏覽器關閉3、 瀏覽器控制 一、元素定位的八大方法 web 自動化測試就是通過代碼對網頁進行測試&#xff0c;在…

前端面經 作用域和作用域鏈

含義&#xff1a;JS中變量生效的區域 分類&#xff1a;全局作用域 或者 局部作用域 局部作用域&#xff1a;函數作用域 和 塊級作用域ES6 全局作用域:在代碼中任何地方都生效 函數中定義函數中生效&#xff0c;函數結束失效 塊級作用域 使用let或const 聲明 作用域鏈:JS查…

【C/C++】RPC與線程間通信:高效設計的關鍵選擇

文章目錄 RPC與線程間通信&#xff1a;高效設計的關鍵選擇1 RPC 的核心用途2 線程間通信的常規方法3 RPC 用于線程間通信的潛在意義4 主要缺點與限制4.1 缺點列表4.2 展開 5 替代方案6 結論 RPC與線程間通信&#xff1a;高效設計的關鍵選擇 在C或分布式系統設計中&#xff0c;…

兩種方法求解最長公共子序列問題并輸出所有解

最長公共子序列&#xff08;Longest Common Subsequence, LCS&#xff09;是動態規劃領域的經典問題&#xff0c;廣泛應用于生物信息學&#xff08;如DNA序列比對&#xff09;、文本差異比對&#xff08;如Git版本控制&#xff09;等領域。本文將通過??自頂向下遞歸記憶化??…

SpringBoot應急知識學習系統開發實現

概述 一個基于SpringBoot開發的應急知識學習系統&#xff0c;該系統提供了完整的用戶注冊、登錄、知識學習與測評功能。對于開發者而言&#xff0c;這是一個值得參考的免費Java源碼項目&#xff0c;可以幫助您快速構建類似的教育平臺。 主要內容 5.2 注冊模塊的實現 系統采…