linux-process-control

Linux進程控制

1. 進程終止

1.1. 進程終止的本質是回收資源

1.1 釋放資源
  • 內存資源
    • 釋放進程的地址空間(mm_struct),包括代碼段、數據段、堆、棧等,通過寫時復制(CoW)共享的頁會減少引用計數,若計數為 0 則釋放物理內存。
    • 銷毀頁表、頁目錄等內存管理結構。
  • 文件資源
    • 關閉所有打開的文件描述符(File Descriptor),對應文件對象(struct file)的引用計數減 1,若計數為 0 則釋放文件對象(關閉文件)。
    • 斷開與管道、socket 等 IPC 資源的關聯,清理相關內核結構。
  • 其他資源
    • 釋放信號處理表、進程定時器、進程間通信(IPC)資源(如共享內存、信號量)等。
    • 從所屬進程組、會話中移除,更新進程組和會話的狀態。
1.2 處理進程狀態
  • 進程狀態從運行態 / 阻塞態等轉為終止態(TASK_DEAD),不再參與調度。
  • 保存進程的退出狀態(exit_status),包括終止原因(正常返回值或信號編號),供父進程查詢。
1.3 處理父進程與子進程的關系
  • 通知父進程:通過信號 SIGCHLD 通知父進程 “子進程已終止”,父進程可通過 wait()waitpid() 系列函數獲取子進程的退出狀態。
  • 僵尸進程(Zombie Process)的產生:若父進程未及時調用 wait() 回收子進程,子進程的 PCB(進程控制塊)會暫時保留(僅釋放大部分資源),成為僵尸進程(狀態為 Z),直到父進程回收或父進程退出。
  • 孤兒進程(Orphan Process)的處理:若父進程先于子進程終止,子進程會被init 進程(PID=1,或 systemd 等現代初始化進程)收養,init 進程會負責調用 wait() 回收孤兒進程,避免其成為僵尸進程。

1.2 進程退出的三種情況

  • 代碼運行完畢,結果正確。

  • 代碼運行完畢,結果不正確。

  • 代碼異常終止。

1.3 進程常見退出方法

  1. main函數返回值。

  2. 調用exit函數。

  • 可以通過 echo $? 查看最近一個退出進程的退出碼。

  • 退出碼0代表代碼運行完畢,結果正確;非0代表代碼運行完畢,結果不正確。

  • 代碼異常終止是通過操作系統發送信號終止的。

2. 進程等待

2.1 進程等待的必要性

  • 防止僵尸進程問題,進而造成內存泄漏

  • 方便父進程管理子進程,通過進程等待可以知道交給子進程的任務完成的怎么樣。

2.2 進程等待的系統調用

2.2.1 wait

等待任意一個子進程終止。

函數原型

#include<sys/types.h>
#include<sys/wait.h>pid_t wait(int* status);

參數

  • status: 輸出型參數,獲取子進程退出狀態,不關心則可以設為 NULL

返回值

  • 成功時:返回終止子進程的PID。

  • 失敗時:返回 -1,并設置 errno。

2.2.2 waitpid
#include<sys/types.h>
#include<sys/wait.h>pid_t waitpid(pid_t pid , int *status , int options);

參數

  • pid:

    • pid > 0: 等待進程ID等于pid的特定子進程

    • pid = -1: 等待任意子進程,等同于 wait

    • pid = 0: 等待與調用進程同進程組的任意子進程。

    • pid < -1: 等于進程組ID等于pid絕對值的任意子進程。

  • status: 輸出型參數,獲取子進程退出狀態,不關心則可以設為 NULL

  • options:

    • 默認為0,表示阻塞等待。

    • WNOHANG: 非阻塞等待(通常配合循環進行使用)

返回值

  • 成功時:返回終止子進程的PID。

  • 失敗時:返回 -1,并設置 errno。

  • 如果指定了 WNOHANG 且沒有子進程狀態發生改變,返回0。

2.2.3 輸出型參數status
  • 傳遞 NULL,表示不關心子進程的退出狀態信息。

  • 否則,操作系統會根據該參數,將子進程的退出信息反饋給父進程。

  • status不能簡單的當作整形來看待,可以當作位圖來看待。

在這里插入圖片描述


  • 可通過系統提供的宏解析status參數

    • WIFEXITED(status): 子進程正常終止為真。

      • 等價:(status&0x7f) == 0
    • WEXITSTATUS(status): 獲取子進程的退出碼。

      • 等價:(status >> 8)&0xff
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>int main () {pid_t id = fork();if (id == 0) {// child processint count = 5;while (count--) {printf("I am a child process , pid: %d , ppid: %d\n" , getpid() , getppid());sleep(1);}exit(100);} else if (id > 0) {// father processint status = 0;while (1) {pid_t res = waitpid(id , &status , WNOHANG);if (res > 0) {// if (WIFEXITED(status)) {    // wifexitedif ((status&0x7f) == 0) { // printf("child process exit code: %d\n" , WEXITSTATUS(status)); // wexitstatusprintf("wait success , child process exit code: %d\n" , (status >> 8)&0xff); // wexitstatus} else {printf("signal code: %d\n" , status&0x7f);}break;} else if (res == 0) {printf("sleep 1s continuous wait\n");sleep(1);} else {perror("waitpid ");exit(1);}}} else {perror("fork ");}return 0;
}

3. 進程替換

3.1 概念

程序替換是指在進程運行過程中,替換當前進程的代碼和數據,使其執行另一個完全不同的程序,但進程ID(PID)保持不變

  • 被替換的部分

    • 代碼段:新程序的代碼指令完全替換原程序的代碼指令。

    • 數據段:包括初始化的全局變量、靜態變量等,被新程序的數據覆蓋。

    • 堆和棧:原有堆和棧會被釋放,新程序會重新初始化自己的堆和棧結構。

    • 內存映射:原進程通過mmap映射的共享庫或文件會被釋放,新程序會加載自己的共享庫和文件映射。

3.2 替換函數

#include <unistd.h>int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg, ...,char *const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);int execve(const char *path, char *const argv[], char *const envp[]);

函數后綴含義

  • l (list):參數以可變參數列表形式傳遞,最后一個參數必須是NULL。
  • v (vector):參數以字符串數組形式傳遞,數組最后一個元素必須是NULL。

  • p (path):在 PATH 環境變量指定的目錄中查找可執行文件。

  • e (environment):可以傳遞自定義的環境變量數組。

返回值

  • exec系列函數不用返回值判斷,只要返回,就是失敗。
3.2.1 execl
execl("/bin/ls" , "ls" , "-l" , NULL);
3.2.2 execlp
execlp("ls" , "ls" , "-l" , NULL);
3.2.3 execle
char *env[] = { "PATH=/bin" , "USER=test" , NULL };
execle("/bin/ls", "ls", "-l", NULL, env);
3.2.4 execv
char *argv[] = {"ls" , "-l" , NULL};
execv("/bin/ls", argv);
3.2.5 execvp
char *argv[] = {"ls" , "-l" , NULL};
execvp("ls", argv);
3.2.6 execvpe
char *argv[] = {"ls", "-l", NULL};
char *env[] = { "PATH=/bin" , "USER=test" , NULL };
execvpe("ls", argv, env);

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

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

相關文章

Autoswagger:揭露隱藏 API 授權缺陷的開源工具

Autoswagger 是一款免費的開源工具&#xff0c;用于掃描 OpenAPI 文檔中列出的 API&#xff0c;查找授權漏洞。 即使在擁有成熟安全團隊的大型企業中&#xff0c;這類漏洞仍然很常見&#xff0c;而且尤其危險&#xff0c;因為即使技術水平不高的人也能利用它們。 Autoswagger…

Golang 語言 Channel 的使用方式

一、無緩存 channel無緩沖channel 可用于兩個goroutine 之間 傳遞信號&#xff0c;比如以下示例&#xff1a;順序打印1 至 100 的奇數和偶數&#xff1a;import ("fmt""time" )func main() {block : make(chan struct{})go odd(block)go even(block)time.S…

Element Plus常見基礎組件(一)

基礎組件 Button 按鈕 一、基礎用法 <el-button>默認按鈕</el-button> <el-button type"primary">主要按鈕</el-button>二、按鈕類型 (type) 類型說明示例代碼default默認按鈕<el-button>默認</el-button>primary主要按鈕&a…

sdxl量化加速筆記

文章目錄一、量化加速sdxl模型1&#xff09;涉及模型2&#xff09;環境安裝3&#xff09;轉換模型safetensor to pytorch文件4&#xff09;tensorRT的環境準備&#xff08;1&#xff09;下載tensorRT 10.10&#xff08;2&#xff09;下載cuda一、量化加速sdxl模型 1&#xff0…

西門子 G120 變頻器全解析:從認知到參數設置

在工業自動化領域&#xff0c;變頻器作為電機驅動的核心設備&#xff0c;其穩定運行與精準控制直接影響生產效率。西門子 G120 變頻器憑借可靠性能與靈活配置&#xff0c;成為眾多工業場景的優選。本文將從基礎認知、操作面板到參數設置&#xff0c;全方位帶你掌握 G120 變頻器…

【自動化運維神器Ansible】YAML支持的數據類型詳解:構建高效Playbook的基石

目錄 1 YAML數據類型概述 1.1 為什么數據類型很重要&#xff1f; 1.2 YAML數據類型分類 2 標量類型&#xff08;Scalars&#xff09; 2.1 字符串&#xff08;String&#xff09; 2.2 布爾值&#xff08;Boolean&#xff09; 2.3 數值&#xff08;Numbers&#xff09; 2…

基于崗位需求的康養休閑旅游服務實訓室建設方案

一、康養休閑旅游服務實訓室建設方案建設需求分析康養休閑旅游服務行業的快速發展對技能人才提出了精準化、場景化的能力要求&#xff0c;康養休閑旅游服務實訓室建設方案需緊密對接健康咨詢、接待服務、康樂服務等核心崗位群的實際需求。從崗位技能來看&#xff0c;健康咨詢崗…

MES 與工業物聯網(IIoT)的化學反應:為何是智能工廠的 “神經中樞”?

從“被動救火”到“主動預警”的工廠革命想象一下&#xff0c;當你正在家中熟睡時&#xff0c;智能手環突然震動&#xff0c;提醒你心率異常&#xff1b;早上出門前&#xff0c;手機 APP 告訴你愛車的某個零件即將達到磨損極限&#xff0c;建議及時更換。這些日常生活中的智能預…

工作好用小工具積累

1、內部環境太多&#xff0c;網站導航git地址&#xff1a;https://github.com/hslr-s/sun-panel/releases gitee地址&#xff1a;https://gitee.com/luofei1284999247/sun-panel

智能Agent場景實戰指南 Day 26:Agent評估與性能優化

【智能Agent場景實戰指南 Day 26】Agent評估與性能優化 開篇 歡迎來到"智能Agent場景實戰指南"系列的第26天&#xff01;今天我們將深入探討智能Agent的評估方法與性能優化技術。構建高效、可靠的智能Agent系統需要完善的評估體系和優化策略&#xff0c;本文將系統…

機器學習——下采樣(UnderSampling),解決類別不平衡問題,案例:邏輯回歸 信用卡欺詐檢測

過采樣&#xff1a; 機器學習——過采樣&#xff08;OverSampling&#xff09;&#xff0c;解決類別不平衡問題&#xff0c;案例&#xff1a;邏輯回歸 信用卡欺詐檢測-CSDN博客 &#xff08;完整代碼在底部&#xff09; 使用下采樣解決類別不平衡問題 —— 以信用卡欺詐識別為…

Qt 槽函數被執行多次,并且使用Qt::UniqueConnection無效【已解決】

Qt 槽函數被執行多次&#xff0c;并且使用Qt::UniqueConnection無效引言一、問題描述二、解決方案三、深入了解信號和槽綁定機制引言 之前剛遇到 - 信號和槽正常連接返回true&#xff0c;但發送信號后槽函數無響應問題&#xff0c;現在又遇到槽函數執行多次&#xff0c;使用Qt…

Autosar Nm-網管報文PNC停發后無法休眠問題排查

文章目錄前言Autosar CanNm標準中的相關參數CanNmAllNmMessagesKeepAwakePN過濾功能CanNm_ConfirmPnAvailability問題描述問題原因排查解決方案擴展總結前言 Autosar Nm中針對于支持PN功能的收發器&#xff0c;要求PNC停發后允許進入休眠模式&#xff0c;開發過程中遇到PNC停發…

RK3568下的進程間通信:基于UDP的mash網絡節點通信

基于UDP的mash網絡節點通信系統實現: 最近的項目中需要實現一個功能,類似mash網絡的功能,比如 類似下圖中的多個節點之間,相互之間通信, 節點A自身的通信列表中,只有B和C,所以A發出的消息給B和C,依次類推,A發送的消息所有節點都能收到,同理,其他節點比如K節點發送的…

Effective C++ 條款17:以獨立語句將newed對象置入智能指針

Effective C 條款17&#xff1a;以獨立語句將newed對象置入智能指針核心思想&#xff1a;使用智能指針管理動態分配的對象時&#xff0c;必須確保new操作與智能指針構造在同一獨立語句中完成&#xff0c;避免編譯器優化順序導致的內存泄漏。 ?? 1. 跨語句初始化的危險性 資源…

Linux iptables防火墻操作

資料&#xff1a; 網絡運維相關 - iptables 【Main】 https://www.zsythink.net/archives/tag/iptables/ netfilter 在 Linux 內核 TCP/IP協議棧中的位置 【框架】【Aulaxiry】 https://zhuanlan.zhihu.com/p/93630586 1 概念詳解 ● 防火墻概念 ○ 主機防火墻 網絡防火墻 ○…

飛書推送工具-自動化測試發送測試報告一種方式

飛書推送工具 要獲取飛書開發所需的 APP_ID、APP_SECRET 以及用戶的 USER_ID&#xff0c;需通過飛書開放平臺和飛書客戶端的相關設置操作。以下是詳細步驟&#xff1a; 一、獲取 APP_ID 和 APP_SECRET&#xff08;飛書應用憑證&#xff09; APP_ID 和 APP_SECRET 是飛書開放…

從零開始的云計算生活——第三十七天,跬步千里,ansible之playbook

目錄 一.故事劇情 二.Playbook簡介 三.Playbook核心元素(重要) 四.Playbook語法 五.Playbook的運行方式 六.Playbooks中tasks語法使用 1、file 2、lineinfile 3、replace 4、shell 5、debug 6、template/copy 7、fetch 8、unarchive 9、wait_for 10、yum 11、…

AI驅動下的數據新基建:騰訊游戲數據資產治理與湖倉架構革新

在大模型技術迅猛發展的今天&#xff0c;AI 正深度重塑數據基礎設施&#xff0c;推動其向智能化快速演進。如何將 AI 深度融入數據管理&#xff0c;釋放數據的潛在價值、提升運營效率&#xff0c;成為企業在構建 AI 驅動的數據資產管理體系的核心問題。在近期舉辦的“DataFun A…

ubuntu 系統風扇控制軟件 CoolerControl

背景 A6000顯卡的溫度一直都是86度左右&#xff0c;GPU的風扇轉速不夠大。 我首先把 nvidia的驅動更新了&#xff0c;但是發現風扇依然依然保持在較低的轉速。 后面無意間搜到了CoolerControl 這個linux平臺的風扇控制軟件。設置之后&#xff0c;增加了風扇的轉速&#xff0c;…