【Linux操作系統】深入探索Linux進程:創建、共享與管理

進程的創建是Linux系統編程中的重要概念之一。在本節中,我們將介紹進程的創建、獲取進程ID和父進程ID、進程共享、exec函數族、wait和waitpid等相關內容。
在這里插入圖片描述

文章目錄

    • 1. 進程的創建
      • 1.1 函數原型和返回值
      • 1.2 函數示例
    • 2. 獲取進程ID和父進程ID
      • 2.1 函數原型和返回值
      • 2.2 函數示例
    • 3. exec函數族
      • 3.1 `exec()`函數族的常見成員:
      • 3.2 函數示例
    • 4. wait和waitpid
      • 4.1 函數解釋
      • 4.2 函數示例
  • 總結


1. 進程的創建

在Linux系統中,進程的創建使用fork()系統調用。fork()系統調用會創建一個與當前進程相同的子進程,子進程會復制父進程的所有資源,包括代碼、數據和文件描述符等。


1.1 函數原型和返回值

fork()函數的原型如下:

#include <unistd.h>pid_t fork(void);

fork()函數 沒有任何參數 ,它的返回值是一個pid_t類型的整數。具體解釋如下:

  • 如果調用成功,fork()函數會在父進程中返回子進程的PID(子進程ID),在子進程中返回0。
  • 如果調用失敗,fork()函數會返回-1,并設置errno來指示錯誤類型。

1.2 函數示例

代碼示例如下:

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>int main() {pid_t pid = fork();if (pid == -1) {printf("Failed to fork a new process.\n");return 1;} else if (pid == 0) {printf("This is the child process.\n");} else {printf("This is the parent process.\n");}return 0;
}

上述代碼中,fork()系統調用會返回兩次,分別在父進程和子進程中返回。通過判斷返回值,我們可以區分父進程和子進程,并執行不同的代碼邏輯。



2. 獲取進程ID和父進程ID

在Linux系統中,可以使用getpid()getppid()系統調用來獲取當前進程的ID和父進程的ID。


2.1 函數原型和返回值

getpid()getppid()函數的原型如下:

#include <sys/types.h>
#include <unistd.h>pid_t getpid(void);
pid_t getppid(void);

這兩個函數都 沒有任何參數 ,它們的返回值都是一個pid_t類型的整數。具體解釋如下:

  • getpid()函數返回調用進程的進程ID(PID)。
  • getppid()函數返回調用進程的父進程的進程ID(PPID)。

2.2 函數示例

代碼示例如下:

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>int main() {pid_t pid = getpid();pid_t ppid = getppid();printf("Process ID: %d\n", pid);printf("Parent Process ID: %d\n", ppid);return 0;
}


3. exec函數族

在Linux系統中,exec()函數族可以用于將當前進程替換為新的程序。exec()函數族包括execl()execv()execle()execve()等函數。這些函數可以根據不同的參數形式來執行不同的替換方式。


3.1 exec()函數族的常見成員:

  1. int execl(const char *path, const char *arg, ...);

    • 參數 path 是要執行的新程序的路徑。
    • 參數 arg 是一個字符串,表示新程序的第一個參數。
    • 可變參數列表是新程序的其他參數,必須以 NULL 結束。
    • 函數執行成功時不會返回,如果返回則表示執行失敗。

  2. int execv(const char *path, char *const argv[]);

    • 參數 path 是要執行的新程序的路徑。
    • 參數 argv 是一個字符串數組,表示新程序的參數列表,最后一個元素必須是 NULL
    • 函數執行成功時不會返回,如果返回則表示執行失敗。

  3. int execle(const char *path, const char *arg, ..., char *const envp[]);

    • 參數 path 是要執行的新程序的路徑。
    • 參數 arg 是一個字符串,表示新程序的第一個參數。
    • 可變參數列表是新程序的其他參數,必須以 NULL 結束。
    • 參數 envp 是一個字符串數組,表示新程序的環境變量列表,最后一個元素必須是 NULL
    • 函數執行成功時不會返回,如果返回則表示執行失敗。

  4. int execvp(const char *file, char *const argv[]);

    • 參數 file 是要執行的新程序的文件名。
    • 參數 argv 是一個字符串數組,表示新程序的參數列表,最后一個元素必須是 NULL
    • 函數執行成功時不會返回,如果返回則表示執行失敗。

這些函數在執行成功時不會返回,而是直接將當前進程替換為新程序。如果返回,則表示執行失敗,可以根據返回值來判斷錯誤類型。

exec()函數族可以用于在當前進程中加載和執行新程序,可以實現程序的動態切換和功能擴展。一般情況下,exec()函數族會在調用fork()函數創建子進程后使用,以替換子進程的代碼和數據。


3.2 函數示例

代碼示例如下:

#include <stdio.h>
#include <unistd.h>int main() {printf("Before exec()\n");execl("/bin/ls", "ls", "-l", NULL);printf("After exec()\n");return 0;
}

上述代碼中,execl()函數會將當前進程替換為ls -l命令。execl()函數的第一個參數是要執行的程序路徑,后續參數是傳遞給新程序的命令行參數。



4. wait和waitpid

在Linux系統中,父進程可以使用wait()waitpid()系統調用等待子進程的結束。這些系統調用會阻塞父進程的執行,直到子進程結束。


4.1 函數解釋

wait()waitpid()是用于等待子進程結束并獲取子進程的退出狀態的函數。

  1. pid_t wait(int *status);

    • 函數會掛起當前進程,直到一個子進程結束。
    • 如果成功等到子進程結束,函數會返回子進程的進程ID。
    • 參數 status 是一個指向整型的指針,用于存儲子進程的退出狀態信息。
    • 如果調用失敗,函數會返回-1。

  2. pid_t waitpid(pid_t pid, int *status, int options);

    • 函數會掛起當前進程,直到指定的子進程結束。
    • 參數 pid 指定要等待的子進程的進程ID。
    • 參數 status 是一個指向整型的指針,用于存儲子進程的退出狀態信息。
    • 參數 options 是一個整型值,用于指定等待的選項。
    • 如果調用失敗,函數會返回-1。

wait()waitpid()函數的返回值是子進程的進程ID,如果調用失敗,則返回-1。通過參數 status 可以獲取子進程的退出狀態信息,包括退出碼、終止信號等。

waitpid()函數相比于wait()函數更加靈活,可以通過參數 pidoptions 控制等待的子進程。

其中,pid 的取值可以是:

  • -1:等待任意子進程。
  • 0:等待與當前進程組ID相同的子進程。
  • 具體的子進程ID:等待指定的子進程。

options 參數可以通過位掩碼的方式指定多個選項,常用的選項有:

  • WNOHANG:非阻塞方式,如果沒有子進程結束,立即返回。
  • WUNTRACED:也會返回已經停止的子進程的狀態。
  • WCONTINUED:也會返回已經繼續運行的子進程的狀態。

wait()waitpid()函數可以用于處理子進程的退出狀態,釋放子進程的資源,并進行進程間的同步。在使用這兩個函數時,需要注意處理錯誤情況和避免僵尸進程的產生。


4.2 函數示例

代碼示例如下:

#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>int main() {pid_t pid = fork();if (pid == -1) {printf("Failed to fork a new process.\n");return 1;} else if (pid == 0) {printf("This is the child process.\n");} else {wait(NULL);printf("This is the parent process.\n");}return 0;
}

上述代碼中,父進程使用wait(NULL)系統調用等待子進程的結束。wait()系統調用會阻塞父進程的執行,直到子進程結束。



總結

  1. fork()函數:用于創建子進程,返回值不同表示在不同的進程中執行。
  2. exec()函數族:用于在當前進程中加載和執行新程序,可以實現程序的動態切換和功能擴展。
    • execl():接受可變參數的形式,參數以字符串形式傳遞。
    • execle():接受可變參數的形式,同時傳遞環境變量。
    • execvp():接受參數數組的形式,參數以字符串數組形式傳遞。
  3. wait()waitpid()函數:用于等待子進程結束并獲取子進程的退出狀態。
    • wait():等待任意子進程結束。
    • waitpid():可以指定等待的子進程。
    • 通過參數 status 可以獲取子進程的退出狀態信息。
    • 可以通過 options 參數控制等待的選項,如非阻塞方式等。
    • 需要注意處理錯誤情況和避免僵尸進程的產生。

這些函數和系統調用可以用于進程的創建、執行和等待,實現進程間的同步和協作。通過這些函數,可以實現進程的動態切換、功能擴展和資源釋放。同時,需要注意處理錯誤情況,避免產生僵尸進程和資源泄漏的問題。

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

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

相關文章

接口測試及接口抓包常用測試工具和方法?

作為測試領域中不可或缺的一環&#xff0c;接口測試和抓包技術在軟件開發過程中扮演著至關重要的角色。不論你是新手還是有一些經驗的小伙伴&#xff0c;本篇文章都會為你詳細介紹接口測試的基本概念、常用測試工具和實際操作技巧&#xff0c;讓你輕松掌握這一技能。 接口測試…

Java數字化智慧工地管理云平臺源碼(人工智能、物聯網、大數據)

智慧工地優勢&#xff1a;"智慧工地”將施工企業現場視頻管理、建筑起重機械安全監控、現場從業人員管理、物料管理、進度管理、揚塵噪聲監測等現場設備有機、高效、科學、規范的結合起來真正實現工程項目業務流與現場各類監控源數據流的有效結合與深度配合&#xff0c;實…

在Hive/Spark上運行執行TPC-DS基準測試 (ORC和TEXT格式)

目前,在Hive/Spark上運行TPC-DS Benchmark主要是通過早期由Hortonworks維護的一個項目:hive-testbench 來完成的。本文我們以該項目為基礎介紹一下具體的操作步驟。不過,該項目僅支持生成ORC和TEXT格式的數據,如果需要Parquet格式,請參考此文《在Hive/Spark上執行TPC-DS基…

動態代理有幾種方式,可以借助Mybatis-plus里面的檢驗動態類

動態代理有很多的分類&#xff1b; 1、JDK原生的動態代理&#xff1b; 2、Spring實現的基于cglib里面的工廠實例化對象&#xff1b; 3、基于原生的cglib造出來的對象 4、基于字節碼的反編譯&#xff1a;assistant 具體的實現類參考&#xff1a; public final class ClassU…

【JVM】對String::intern()方法深入詳解(JDK7及以上)

文章目錄 1、什么是intern&#xff1f;2、經典例題解釋例1例2例3 1、什么是intern&#xff1f; String::intern()是一個本地方法&#xff0c;它的作用是如果字符串常量池中已經包含一個等于此String對象的字符串&#xff0c;則返回代表池中這個字符串的String對象的引用&#…

Java開源項目mall學習筆記(1)——項目初始化

一、學習聲明與項目介紹 該筆記是記錄學習開源項目mall過程的文檔筆記&#xff0c;完全原創&#xff0c;轉載請聲明。同時也對開源項目的作者表示感謝&#xff01; mall: &#x1f525; mall項目是一套基于 SpringBoot Vue uni-app 實現的電商系統&#xff0c;包括前臺商城項…

編譯鴻蒙codelabs安裝時報錯

學習鴻蒙ArkTS時編譯codelabs樣例代碼&#xff0c;發現編譯完成報錯。目前鴻蒙的資料比較少&#xff0c;且官方文檔路徑很深&#xff0c;遂記錄下來&#xff0c;以資來者。 error: failed to start ability. Error while Launching activity修改module.json5中的exported為tru…

ArcGIS 利用cartogram插件制作變形地圖

成果圖 注&#xff1a;本圖數據并不完全對&#xff0c;只做為測試用例 操作 首先需要下載一個插件cartogram 下載地址在這里 https://www.arcgis.com/home/item.html?idd348614c97264ae19b0311019a5f2276 下載完畢之后解壓將Cartograms\HelpFiles下的所有文件復制到ArcGIS…

ffmpeg的使用

1、ffmpeg的安裝 # 安裝wget yum -y install wget # 安裝ffmpeg壓縮包 wget --no-check-certificate https://www.johnvansickle.com/ffmpeg/old-releases/ffmpeg-4.0.3-64bit-static.tar.xz # 解壓 tar -xJf ffmpeg-4.0.3-64bit-static.tar.xz # 進入目錄 cd ffmpeg-4.0.3-64…

【Git】(二)分支

1、創建分支 已存在主分支master&#xff0c;現在需要創建v1.0的版本&#xff0c;一般直接在web頁面操作。 v1.0分支&#xff0c;基線master&#xff0c;稱為項目分支。 假如&#xff0c;v1.0項目存在兩個項目成員sunriver2000和snow&#xff0c;一般還會再針對個人創建個人…

nodejs+vue+elementui學生檔案信息管理系統_06bg9

利用計算機網絡的便利&#xff0c;開發一套基于nodejs的大學生信息管理系統&#xff0c;將會給人們的生活帶來更多的便利&#xff0c;而且在經濟效益上&#xff0c;也會有很大的便利!這可以節省大量的時間和金錢。學生信息管理系統是學校不可缺少的一個環節&#xff0c;其內容直…

說一下什么是tcp的2MSL,為什么客戶端在 TIME-WAIT 狀態必須等待 2MSL 的時間?

1.TCP之2MSL 1.1 MSL MSL:Maximum Segment Lifetime報文段最大生存時間&#xff0c;它是任何報文段被丟棄前在網絡內的最長時間 1.2為什么存在MSL TCP報文段以IP數據報在網絡內傳輸&#xff0c;而IP數據報則有限制其生存時間的TTL字段&#xff0c;并且TTL的限制是基于跳數 1.3…

[高光譜]PyTorch使用CNN對高光譜圖像進行分類

項目原地址&#xff1a; Hyperspectral-Classificationhttps://github.com/eecn/Hyperspectral-ClassificationDataLoader講解&#xff1a; [高光譜]使用PyTorch的dataloader加載高光譜數據https://blog.csdn.net/weixin_37878740/article/details/130929358 一、模型加載 在…

使用JMeter創建數據庫測試

好吧&#xff01;我一直覺得我不聰明&#xff0c;所以&#xff0c;我用最詳細&#xff0c;最明了的方式來書寫這個文章。我相信&#xff0c;我能明白的&#xff0c;你們一定能明白。 我的環境&#xff1a;MySQL&#xff1a;mysql-essential-5.1.51-win32 jdbc驅動&#xff1a;…

mysql 03.查詢(重點)

先準備測試數據&#xff0c;代碼如下&#xff1a; -- 創建數據庫 DROP DATABASE IF EXISTS mydb; CREATE DATABASE mydb; USE mydb;-- 創建student表 CREATE TABLE student (sid CHAR(6),sname VARCHAR(50),age INT,gender VARCHAR(50) DEFAULT male );-- 向student表插入數據…

PHP 公交公司充電樁管理系統mysql數據庫web結構apache計算機軟件工程網頁wamp

一、源碼特點 PHP 公交公司充電樁管理系統是一套完善的web設計系統&#xff0c;對理解php編程開發語言有幫助&#xff0c;系統具有完整的源代碼和數據庫&#xff0c;系統主要采用B/S模式開發。 源碼下載 https://download.csdn.net/download/qq_41221322/88220946 論文下…

【面試問題】當前系統查詢接口需要去另外2個系統庫中實時查詢返回結果拼接優化思路

文章目錄 場景描述優化思路分享資源 場景描述 接口需要從系統1查詢數據&#xff0c;查出的每條數據需要從另一個系統2中再去查詢某些字段&#xff0c; 比如&#xff1a;從系統1中查出100條數據&#xff0c;每條數據需要去系統2中再去查詢出行數據&#xff0c;可能系統1一條數…

socks5 保障網絡安全與爬蟲需求的完美融合

Socks5代理&#xff1a;跨足網絡安全和爬蟲領域的全能選手 Socks5代理作為一種通用的網絡協議&#xff0c;為多種應用場景提供了強大的代理能力。它不僅支持TCP和UDP的數據傳輸&#xff0c;還具備更高級的安全特性&#xff0c;如用戶身份驗證和加密通信。在網絡安全中&#xf…

蘋果手機批量刪除聯系人的2個方法,請查收!

【想要清理通訊錄里的“僵尸號”&#xff0c;但是突然發現手機不能批量刪除。一個一個刪除太麻煩了&#xff0c;有什么辦法可以一次性多刪幾個人嗎&#xff1f;】 小編想問問果粉們平時都是怎么刪除聯系人的&#xff1f;特別是要刪除多個聯系人的時候&#xff0c;大家還是選擇…

matlab保存圖片

僅作為記錄&#xff0c;大佬請跳過。 文章目錄 用界面中的“另存為”用saveas 用界面中的“另存為” 即可。 參考 感謝大佬博主文章&#xff1a;傳送門 用saveas 必須在編輯器中的plot之后用saveas&#xff08;也就是不能在命令行中單獨使用——比如在編輯器中plot&#xf…