Linux-進程相關函數

文章目錄

  • Linux-進程相關函數
    • 父子進程關系
    • 父子進程地址空間
    • getpid函數 獲取本進程號
    • getppid函數 獲取當前進程的進程的父進程號
    • getpgid函數 獲取進程組號
    • 示例
    • fork函數 創建進程
    • 區分父子進程
    • exit函數 進程退出
    • wait函數 等待子進程退出
    • waitpid函數

Linux-進程相關函數

每個進程都由一個進程號來標識,其類型為 pid_t(整型),進程號的范圍:0~32767。進程號總是唯一的,但進程號可以重用。當一個進程終止后,其進程號就可以再次使用。

進程號(PID)

標識進程的一個非負整型數。

父進程號(PPID)

任何進程( 除 init 進程)都是由另一個進程創建,該進程稱為被創建進程的父進程,對應的進程號稱為父進程號(PPID)。如,A 進程創建了 B 進程,A 的進程號就是 B 進程的父進程號。

進程組號(PGID)

進程組是一個或多個進程的集合。他們之間相互關聯,進程組可以接收同一終端的各種信號,關聯的進程有一個進程組號(PGID) 。這個過程有點類似于 QQ 群,組相當于 QQ 群,各個進程相當于各個好友,把各個好友都拉入這個 QQ 群里,主要是方便管理,特別是通知某些事時,只要在群里吼一聲,所有人都收到,簡單粗暴。但是,這個進程組號和 QQ 群號是有點區別的,默認的情況下,當前的進程號會當做當前的進程組號。

父子進程關系

使用 fork() 函數得到的子進程是父進程的一個復制品,它從父進程處繼承了整個進程的地址空間:包括進程上下文(進程執行活動全過程的靜態描述)、進程堆棧、打開的文件描述符、信號控制設定、進程優先級、進程組號等。

子進程所獨有的只有它的進程號,計時器等(只有小量信息)。因此,使用 fork() 函數的代價是很大的。

在這里插入圖片描述
簡單來說, 一個進程調用 fork() 函數后,系統先給新的進程分配資源,例如存儲數據和代碼的空間。然后把原來的進程的所有值都復制到新的新進程中,只有少數值與原來的進程的值不同。相當于克隆了一個自己。

實際上,更準確來說,Linux 的 fork() 使用是通過寫時拷貝 (copy- on-write) 實現。寫時拷貝是一種可以推遲甚至避免拷貝數據的技術。內核此時并不復制整個進程的地址空間,而是讓父子進程共享同一個地址空間。只用在需要寫入的時候才會復制地址空間,從而使各個進行擁有各自的地址空間。也就是說,資源的復制是在需要寫入的時候才會進行,在此之前,只有以只讀方式共享。

注意:fork之后父子進程共享文件,fork產生的子進程與父進程相同的文件文件描述符指向相同的文件表,引用計數增加,共享文件文件偏移指針。

  • Linux 的 fork() 使用是通過寫時拷貝 (copy- on-write),讀時共享實現

父子進程地址空間

  • 父子進程各自的地址空間是獨立的

getpid函數 獲取本進程號

#include <sys/types.h>
#include <unistd.h>
?
pid_t getpid(void);
功能:獲取本進程號(PID)
參數:無
返回值:本進程號

getppid函數 獲取當前進程的進程的父進程號

#include <sys/types.h>
#include <unistd.h>
?
pid_t getppid(void);
功能:獲取調用此函數的進程的父進程號(PPID)
參數:無
返回值:調用此函數的進程的父進程號(PPID)

getpgid函數 獲取進程組號

#include <sys/types.h>
#include <unistd.h>
?
pid_t getpgid(pid_t pid);
功能:獲取進程組號(PGID)
參數:pid:進程號
返回值:參數為 0 時返回當前進程組號,否則返回參數指定的進程的進程組號

示例

int main()
{pid_t pid, ppid, pgid;
?pid = getpid();printf("pid = %d\n", pid);
?ppid = getppid();printf("ppid = %d\n", ppid);
?pgid = getpgid(pid);printf("pgid = %d\n", pgid);
?return 0;
}

fork函數 創建進程

#include <sys/types.h>
#include <unistd.h>
?
pid_t fork(void);
功能:用于從一個已存在的進程中創建一個新進程,新進程稱為子進程,原進程稱為父進程。
參數:無
返回值:成功:子進程中返回 0,父進程中返回子進程 ID。pid_t,為整型。失敗:返回-1。失敗的兩個主要原因是:1)當前的進程數已經達到了系統規定的上限,這時 errno 的值被設置為 EAGAIN。2)系統內存不足,這時 errno 的值被設置為 ENOMEM。

區分父子進程

int main()
{pid_t pid;pid = fork();if (pid < 0){   // 沒有創建成功  perror("fork");return 0;}
?if (0 == pid){ // 子進程  while (1){printf("I am son\n");sleep(1);}}else if (pid > 0){ // 父進程  while (1){printf("I am father\n");sleep(1);}}
?return 0;
}

exit函數 進程退出

#include <stdlib.h>
void exit(int status);
?
#include <unistd.h>
void _exit(int status);
功能:結束調用此函數的進程。
參數:status:返回給父進程的參數(低 8 位有效),至于這個參數是多少根據需要來填寫。
返回值:無

exit() 和 _exit() 函數功能和用法是一樣的,無非時所包含的頭文件不一樣,還有的區別就是:exit()屬于標準庫函數,exit()屬于系統調用函數。

  • exit() 函數會處理后續的刷新緩沖區的動作
  • _exit() 是直接退出進程,不做任何的后續處理操作

在這里插入圖片描述

wait函數 等待子進程退出

在每個進程退出的時候,內核釋放該進程所有的資源、包括打開的文件、占用的內存等。但是仍然為其保留一定的信息,這些信息主要主要指進程控制塊PCB的信息(包括進程號、退出狀態、運行時間等)。

父進程可以通過調用wait或waitpid得到它的退出狀態同時徹底清除掉這個進程。

wait() 和 waitpid() 函數的功能一樣,區別在于,wait() 函數會阻塞,waitpid() 可以設置不阻塞,waitpid() 還可以指定等待哪個子進程結束。

注意:一次wait或waitpid調用只能清理一個子進程,清理多個子進程應使用循環。

#include <sys/types.h>
#include <sys/wait.h>
?
pid_t wait(int *status);
功能:等待任意一個子進程結束,如果任意一個子進程結束了,此函數會回收該子進程的資源。
參數:status : 進程退出時的狀態信息。
返回值:成功:已經結束子進程的進程號失敗: -1

調用 wait() 函數的進程會掛起(阻塞),直到它的一個子進程退出或收到一個不能被忽視的信號時才被喚醒(相當于繼續往下執行)。

若調用進程沒有子進程,該函數立即返回;若它的子進程已經結束,該函數同樣會立即返回,并且會回收那個早已結束進程的資源。

所以,wait()函數的主要功能為回收已經結束子進程的資源。

如果參數 status 的值不是 NULL,wait() 就會把子進程退出時的狀態取出并存入其中,這是一個整數值(int),指出了子進程是正常退出還是被非正常結束的。

這個退出信息在一個 int 中包含了多個字段,直接使用這個值是沒有意義的,我們需要用宏定義取出其中的每個字段。

宏函數可分為如下三組:

  1. WIFEXITED(status)

為非0 → 進程正常結束

WEXITSTATUS(status)

如上宏為真,使用此宏 → 獲取進程退出狀態 (exit的參數)

  1. WIFSIGNALED(status)

為非0 → 進程異常終止

WTERMSIG(status)

如上宏為真,使用此宏 → 取得使進程終止的那個信號的編號。

  1. WIFSTOPPED(status)

為非0 → 進程處于暫停狀態

WSTOPSIG(status)

如上宏為真,使用此宏 → 取得使進程暫停的那個信號的編號。

WIFCONTINUED(status)

為真 → 進程暫停后已經繼續運行

waitpid函數

#include <sys/types.h>
#include <sys/wait.h>
?
pid_t waitpid(pid_t pid, int *status, int options);
功能:等待子進程終止,如果子進程終止了,此函數會回收子進程的資源。
?
參數:pid : 參數 pid 的值有以下幾種類型:pid > 0  等待進程 ID 等于 pid 的子進程。pid = 0  等待同一個進程組中的任何子進程,如果子進程已經加入了別的進程組,waitpid 不會等待它。pid = -1 等待任一子進程,此時 waitpid 和 wait 作用一樣。pid < -1 等待指定進程組中的任何子進程,這個進程組的 ID 等于 pid 的絕對值。
?status : 進程退出時的狀態信息。和 wait() 用法一樣。
?options : options 提供了一些額外的選項來控制 waitpid()0:同 wait(),阻塞父進程,等待子進程退出。WNOHANG:沒有任何已經結束的子進程,則立即返回。WUNTRACED:如果子進程暫停了則此函數馬上返回,并且不予以理會子進程的結束狀態。(由于涉及到一些跟蹤調試方面的知識,加之極少用到)返回值:waitpid() 的返回值比 wait() 稍微復雜一些,一共有 3 種情況:1) 當正常返回的時候,waitpid() 返回收集到的已經回收子進程的進程號;2) 如果設置了選項 WNOHANG,而調用中 waitpid() 發現沒有已退出的子進程可等待,則返回 03) 如果調用中出錯,則返回-1,這時 errno 會被設置成相應的值以指示錯誤所在,如:當 pid 所對應的子進程不存在,或此進程存在,但不是調用進程的子進程,waitpid() 就會出錯返回,這時 errno 被設置為 ECHILD;

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

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

相關文章

數據挖掘 6.1 其他降維方法(不是很重要)

6.1 Other dimensionality reduction methods 6.1 其他降維方法 其他降維方法前言問題答案流形3 降維大綱3.1 線性方法3.2 非線性方法3.2.1 流形學習方法&#xff08;Manifold Learning&#xff09;3.2.2 概率方法&#xff08;Probabilistic Approaches&#xff09;3.2.3 拓撲數…

Unity中的特殊文件夾

一.工程路徑獲取print(Application.dataPath);只用于游戲開發編輯器模式下&#xff0c;游戲發布后此路徑就不存在了二.Resources 資源文件夾//路徑獲取: //一般不獲取 //只能使用Resources相關API進行加載 //如果硬要獲取 可以用工程路徑拼接print(Application.dataPath "…

Seaborn數據可視化實戰:Seaborn高級使用與性能優化教程

Seaborn最佳實踐與技巧 學習目標 本課程將深入探討Seaborn庫的高級使用技巧&#xff0c;包括性能優化、常見問題解決方法等&#xff0c;旨在幫助學員掌握如何高效地使用Seaborn進行數據可視化&#xff0c;提升圖表的美觀度和信息傳達效率。 相關知識點 Seaborn最佳實踐與技巧 學…

分布式系統與單機系統的優劣勢對比

近期有遇到一個本地部署的需求&#xff0c;他們希望用主備方案&#xff0c;這就涉及到了備用系統怎么收費的問題。我們是單機系統&#xff0c;其他友商是分布式系統&#xff0c;那20坐席的手撥需求到底是選單機系統好&#xff0c;還是選分布式系統好呢&#xff1f;了解了兩者的…

深度學習:從手寫數字識別案例認識pytorch框架

目錄 一、PyTorch 核心優勢與框架定位 二、實戰基礎&#xff1a;核心庫與數據準備 1. 關鍵庫導入與功能說明 2. MNIST 數據集加載與可視化 &#xff08;1&#xff09;數據集下載與封裝 &#xff08;2&#xff09;數據集可視化&#xff08;可選&#xff09; 3. DataLoade…

二分|組合|旋轉數組

lc1976dijk min_pathpq. min_wlcr187同lc1823.約瑟夫環class Solution { public:int iceBreakingGame(int num, int target) {int x0;for(int i2;i<num;i){x(xtarget)%i;} return x;} };lc2972計算數組中可移除的子數組數量先找最長遞增前綴&#xff0c;再結合遞增后綴…

【C語言16天強化訓練】從基礎入門到進階:Day 10

&#x1f525;個人主頁&#xff1a;艾莉絲努力練劍 ?專欄傳送門&#xff1a;《C語言》、《數據結構與算法》、C語言刷題12天IO強訓、LeetCode代碼強化刷題、洛谷刷題、C/C基礎知識知識強化補充、C/C干貨分享&學習過程記錄 &#x1f349;學習方向&#xff1a;C/C方向學習者…

云計算與云原生技術探索

&#x1f31f; Hello&#xff0c;我是蔣星熠Jaxonic&#xff01; &#x1f308; 在浩瀚無垠的技術宇宙中&#xff0c;我是一名執著的星際旅人&#xff0c;用代碼繪制探索的軌跡。 &#x1f680; 每一個算法都是我點燃的推進器&#xff0c;每一行代碼都是我航行的星圖。 &#x…

STM32之ADC詳解

一、ADC概述 ADC&#xff08;模擬量轉數字量轉換器&#xff09;&#xff0c;在 STM32 開發中&#xff0c;利用 ADC 端口的電壓數據&#xff0c;轉換為對應的具體數字量數據內容。可通過 ADC 方式獲取常用數據內容有&#xff1a; 光敏電阻、電池電量、油箱油量 ADC 轉換…

深入理解計算機網絡:從基礎到應用的全面解析

標題&#xff1a;深入理解計算機網絡&#xff1a;從基礎到應用的全面解析 引言 計算機網絡已經滲透到我們生活的方方面面。從家庭Wi-Fi到全球互聯網&#xff0c;我們每天都在通過各種設備進行數據交換。本文將帶領你走進計算機網絡的世界&#xff0c;深入探討網絡的基礎知識、常…

以結構/序列/功能之間的關系重新定義蛋白質語言模型的分類:李明辰博士詳解蛋白質語言模型

上海交通大學第三屆「AI for Bioengineering 暑期學校」于 2025 年 8 月 8—10 日正式開啟。本次暑期學校匯聚了自全球 70 余所高校、 10 余所科研機構及 10 余家行業領軍企業的 200 余位青年才俊、科研學者和產業代表&#xff0c;共同聚焦于人工智能&#xff08;AI&#xff09…

【大語言模型 15】因果掩碼與注意力掩碼實現:深度學習中的信息流控制藝術

【大語言模型 15】因果掩碼與注意力掩碼實現&#xff1a;深度學習中的信息流控制藝術 關鍵詞&#xff1a;因果掩碼、注意力掩碼、下三角掩碼、Padding掩碼、序列建模、GPT解碼器、BERT編碼器、批量處理優化、自回歸語言模型、信息流控制 摘要&#xff1a;在Transformer架構中&a…

大型電動化工程機械設備智能施工試驗場的網絡設計方案

隨著工程機械設備逐步邁向智能化、電動化和無人化&#xff0c;傳統施工試驗場已經難以滿足現代化施工設備的研發、測試和驗證需求。為了適應這一趨勢&#xff0c;建設一個基于高性能網絡架構的大型智能施工試驗場成為關鍵。本文將從網絡架構、設備選型和功能實現等方面&#xf…

SPMI總線協議(一)

1、簡單說明 系統電源管理接口( System Power Management Interface簡稱SPMI)是一種雙線串行接口,用于連接片上系統(SoC)處理器系統的集成電源控制器(PC)與一個或多個電源管理集成電路(PMIC)電壓調節系統。SPMI 使系統能夠使用單個 SPMI 總線動態調整 SoC 內部電壓域的…

數據存儲的思考——從RocketMQ和Mysql的架構入手

數據存儲是后臺服務系統永遠繞不開的知識 筆者希望能夠從宏觀的角度出發&#xff0c;思考數據存儲系統的共性和設計方案&#xff0c;嘗試從Mysql和RocketMQ的角度去思考談談系統存儲架構的設計哲學 前置的知識 什么是RocketMQ、什么是Mysql&#xff0c;他們對于后端系統的主用…

MySQL 面試題系列(二)

目錄1: SQL 中常見的 JOIN 類型有哪些&#xff1f;請分別說明其連接邏輯和適用場景。2: UNION 和 UNION ALL 有什么區別&#xff1f;它們各自的適用場景是什么&#xff1f;3: 什么是視圖 (View)&#xff1f;它的作用和優缺點是什么&#xff1f;4: 什么是索引 (Index)&#xff1…

PostgreSQL診斷系列(2/6):鎖問題排查全攻略——揪出“阻塞元兇”

&#x1f517; 接上一篇《PostgreSQL全方位體檢指南》&#xff0c;今天我們深入數據庫的“神經系統”——鎖機制&#xff0c;解決最令人頭疼的“卡頓”問題。 你是否經歷過&#xff1a; 某個SQL執行著就不動了&#xff1f;應用界面卡在“加載中”&#xff1f;UPDATE 語句遲遲不…

crc16是什么算法

核心概念?CRC16? 是一種循環冗余校驗算法&#xff0c;屬于哈希函數的一種。它的核心目的是檢測數據的錯誤&#xff0c;通常用于數字網絡和存儲設備中&#xff0c;來驗證數據在傳輸或存儲后是否依然完整、無誤。你可以把它想象成一個數據的“指紋”或“摘要”。發送方計算出一…

Day8--HOT100--160. 相交鏈表,206. 反轉鏈表,234. 回文鏈表,876. 鏈表的中間結點

Day8–HOT100–160. 相交鏈表&#xff0c;206. 反轉鏈表&#xff0c;234. 回文鏈表&#xff0c;876. 鏈表的中間結點 每日刷題系列。今天的題目是力扣HOT100題單。 鏈表題目。 160. 相交鏈表 思路【我】&#xff1a; 1&#xff0c;計算鏈表長度 2&#xff0c;令A為較短鏈&am…

Rust面試題及詳細答案120道(58-65)-- 集合類型

《前后端面試題》專欄集合了前后端各個知識模塊的面試題&#xff0c;包括html&#xff0c;javascript&#xff0c;css&#xff0c;vue&#xff0c;react&#xff0c;java&#xff0c;Openlayers&#xff0c;leaflet&#xff0c;cesium&#xff0c;mapboxGL&#xff0c;threejs&…