進程控制

一. 進程創建

1.fork的概念與使用

在 Linux 中 fork 可以在一個進程中創建一個新的進程。這個新進程稱為子進程,原進程為父進程。使用前需要包含頭文件 #include <unistd.h> 。在調用 fork 函數時,子進程與父進程會共享數據和代碼,此時它們共用同一塊物理地址空間。但當子進程或父進程運行時,對數據進行了修改進行了寫入,此時系統將進行寫時拷貝,重新給子進程或者父進程申請物理地址。

fork 函數調用時父進程會返回子進程 pid (大于0),子進程會返回0。

二. 進程終止?

進程的退出場景分為三類,第一是代碼運行完畢并且結果正確,第二是代碼運行完畢但結果不正確,第三是代碼運行時異常終止。

在第一種和第二種情況下,我們可以通過退出碼來分辨,退出碼為0就是結果正確,不為0結果不正確。不同的退出碼代表不同的退出狀態。

?當我們想查看進程最近一次的退出碼時,輸入指令 echo $?? 可以查看到退出碼。

我們通常退出程序時以return exit 或 _exit 結尾終止進程。那么它們直接有什么區別呢?

return 返回通常為函數終止,但不一定代表結束,若在函數中return 返回后程序還會繼續運行。而exit 退出則代表程序結束了,此時 exit 會自動執行全局清理。_exit 與 exit 的區別在于 _exit 可以在任意位置結束程序,并且不會對全局進行清理。

int main()
{
printf("hello");
exit(0);
}
運?結果:
[root@localhost linux]# ./a.out
hello[root@localhost linux]#int main()
{
printf("hello");
_exit(0);
}
運?結果:
[root@localhost linux]# ./a.out
[root@localhost linux]#

?三. 進程等待

在進程中,子進程退出若父進程不進行管理,會導致子進程變成“僵尸進程”,造成內存泄漏。在進程等待中,我們用 wait 和 waitpid 這兩個函數。

3.1 wait與waitpid

我們在使用這兩個函數前要包含兩個頭文件。

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

其中status用于儲存 wait 中子進程的退出狀態,status需要是一個int類型,我們需要將他視作位圖,里面會存儲進程的退出碼,我們也可以傳遞NULL進去表示不關心退出狀態。若子進程成功退出,wait會返回子進程pid,若失敗則返回-1。

pid_t waitpid(pid_t pid,int *status,int options)

waitpid 內包含了三個參數,pid,status和options,這里的pid調用的是等待進程的pid,而status與上文一致,options分為阻塞等待和非阻塞等待(下文講解)。

3.2 阻塞與非阻塞等待

阻塞等待阻塞的是父進程,當父進程處于阻塞狀態時,不能進行其他的代碼操作,需要一直等待子進程完成任務后得到退出碼才能執行自己的代碼。而非阻塞等待的父進程可以在等待子進程時,運行父進程的代碼,我們可以通過循環的方式,限制多長時間對子進程進行訪問是否返回。

通過一個簡單的例子說明,我們在等待女友化妝,阻塞等待就是單純的等女友化完妝,而非阻塞等待意味著,我們可以在女友化妝時做一些其他的事情。

下面是進程阻塞方式的代碼:

此時options的參數為0.

int main()
{pid_t pid;pid = fork();if (pid < 0) {printf("%s fork error\n", __FUNCTION__);return 1;}else if (pid == 0) { //childprintf("child is run, pid is : %d\n", getpid());sleep(5);exit(257);}else {int status = 0;pid_t ret = waitpid(-1, &status, 0);//阻塞式等待,等待5Sprintf("this is test for wait\n");if (WIFEXITED(status) && ret == pid) {printf("wait child 5s success, child return code is:%d.\n",WEXITSTATUS(status));}else {printf("wait child failed, return.\n");return 1;}}return 0;
}運?結果:
[root@localhost linux]# ./a.out
child is run, pid is : 45110
this is test for wait
wait child 5s success, child return code is :1.

pid 返回了子進程的pid,并且等待了5秒。

四. 進程程序替換

4.1 替換原理

程序在 fork() 之后,父進程和子進程共用同一份代碼(可能執行不同的分支),若我們當前想讓子進程獨立執行一個全新的程序該如何操作呢?

這里我們會調用一種exec開頭的函數,他會將我們子進程的代碼進行替換,將需要更換的程序從磁盤里面拷貝下來。他不會產生新的進程,所以子進程的 pid 仍然保持不變,exec 只是對代碼段數據段進行了替換。

4.2 替換函數

一共有六中以 exec 開頭的函數:

#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[]);

?4.2.1 execl

execl 參數有 path 和 arg,path 代表要替換程序在磁盤中的文件地址,arg 代表需要替換的功能。

execl("/bin/ls", "ls", "-l", NULL);

在文件 /bin/ls 下 ,調用 ls -l 這一功能,其中要在末尾添加上NULL,代表結束。

4.2.2 execlp

execlp 參數有 file 和 arg,file 可以根據命令查找到對應的文件,例如我們可以將 /bin/ls 文件改為 ls 也能實現同樣的功能。后面的 arg 代表要實現的功能。

execlp("ls", "ls", "-l", NULL);

4.2.3 execle

execle 與 execlp 的不同之處在于,它的代表著環境變量 env ,我們在調用時需要自己組裝環境變量,當然也可以使用系統環境變量。

我們可以對第三個參數 envp【】自行添加環境變量,例如 { "KEY1=VALUE1","KEY2=VALUE2"};

execle("ls", "ls", "-l", NULL, envp);

4.2.4 execv

我們將 execv 與 execl 進行對比,它們區別在于 “v” 傳遞的參數為數組,而 “l” 傳遞的參數為指針。

char *const argv[] = {"ls", "-l", NULL};
execv("/bin/ps", argv);

同樣的,在數組最后也要加上NULL表示終止。

4.2.5 execvp

結合上述對函數的解析,這個函數我們不難進行理解,“v” 代表傳遞的是數組(里面包含相應調用的功能),“p” 代表根據功能找到對應的文件地址。

char *const argv[] = {"ls", "-l", NULL};
execvp("ls", argv);

4.2.6 execve

與 exec 相比多了 “e”和 “v” ,也就是需要添加數組和環境變量數組。

char *const argv[] = {"ls", "-l", NULL};
char *const envp[] = {"PATH=/bin:/usr/bin", "TERM=console", NULL};
execve("/bin/ls", argv, envp);

總結:事實上,在操作系統中真正被調用的只有 execve 這個函數,其他函數都是對其進了封裝。因為在 man 手冊第二節存在execve ,而其他函數都在man 手冊第三節。本質是將 “l” 轉化為 “v” 將可變參數報錯帶數組中,將 “p” 轉化為 “e” 將環境變量轉化為數組。?

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

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

相關文章

造輪子系列:從0到1打造生產級HTTP客戶端,優雅封裝OkHttp/HttpClient,支持異步、重試與文件操作

TechZhi HTTP Client Starter 源碼特性快速開始1. 添加依賴2. 配置3. 使用 主要功能支持的HTTP方法文件操作功能高級功能配置示例 API使用示例基本請求自定義請求異步請求文件操作示例錯誤處理 構建和測試依賴說明 本文將介紹一款本人開發的高性能Spring Boot HTTP客戶端Starte…

Java過濾器的基本概念

概述 Java 過濾器是 Java EE (Jakarta EE) 中的一種組件&#xff0c;用于在請求到達 Servlet 或 JSP 之前對其進行預處理&#xff0c;或者在響應返回客戶端之前對其進行后處理。過濾器主要應用于以下場景&#xff1a; 請求參數過濾和轉換字符編碼處理身份驗證和授權日志記錄壓…

gbase8s數據庫獲取jdbc/odbc協議的幾種方式

PROTOCOLTRACEFILED:\sqltrace1.log;PROTOCOLTRACE5 jdbc 參數 &#xff0c;明文協議&#xff0c;并發時 會錯亂&#xff0c;適合單線程調試 SQLIDEBUGC:\Users\lenovo\Desktop\sqlidebug.log1 jdbc參數&#xff0c;密文協議&#xff0c;需使用解密工具解析&#xff0c;解析…

【android bluetooth 框架分析 04】【bt-framework 層詳解 7】【AdapterProperties介紹】

前面我們提到了 藍牙協議棧中的 Properties &#xff0c; 這篇文章是 他的補充。 【android bluetooth 框架分析 04】【bt-framework 層詳解 6】【Properties介紹】 在 AOSP&#xff08;Android Open Source Project&#xff09;中&#xff0c;AdapterProperties 是一個 Java…

C盤瘦身?

突然發現回收站底部有橫幅辣眼睛&#xff01; 點擊深度清理跳轉C盤瘦身 點擊一鍵瘦身跳轉支付 回收站右鍵還有菜單 回收站右鍵可以通過設置關閉 回收站底部橫幅關不了&#xff01; 流氓沒人管了嗎&#xff1f;

用戶通知服務,輕松實現應用與用戶的多場景交互

用戶在使用應用時&#xff0c;經常想要了解應用程序在執行的操作&#xff0c;如下載完成、新郵件到達、發布即時的客服支付通知等&#xff0c;這些通知除了攜帶基本的文本圖片信息外&#xff0c;最好還可以支持文件上傳下載進度場景下的進度條通知&#xff0c;以及點擊通知欄可…

蘋果獲智能錢包專利,Find My生態版圖或再擴張:錢包會“說話”還能防丟

蘋果公司近日成功獲批一項突破性專利&#xff0c;揭示了一種支持Find My網絡的全新智能錢包設計方案。該錢包不僅能智能管理用戶的信用卡、身份證等實體卡片&#xff0c;更具備了追蹤定位和通過揚聲器發聲提醒的能力&#xff0c;有望成為蘋果“查找”&#xff08;Find My&#…

當機床開始“思考”,傳統“制造”到“智造”升級路上的法律暗礁

——首席數據官高鵬律師團隊創作&#xff0c;AI輔助 一、被時代推著走的工廠&#xff1a;從“鐵疙瘩”到“智能體”的陣痛 某汽車零部件廠的李廠長至今記得三年前的凌晨。為了趕上新能源車企的訂單&#xff0c;廠里咬牙引進了兩條智能生產線&#xff0c;可調試第三天&#xff…

概率基礎——不確定性的數學

第05篇&#xff1a;概率基礎——不確定性的數學 寫在前面&#xff1a;大家好&#xff0c;我是藍皮怪&#xff01;前幾篇我們聊了統計學的基本概念、數據類型、描述性統計和數據可視化&#xff0c;今天我們要進入統計學的另一個重要基礎——概率論。你有沒有想過&#xff0c;為什…

爬蟲遇到base64編碼(非常規版)

一.特征 從 Base64 的核心特性入手&#xff0c;比如它的編碼原理&#xff08;將二進制數據轉換為 ASCII 字符集&#xff09;和字符集的組成&#xff08;A-Z、a-z、0-9、、/ 和 &#xff09;。這是 Base64 最基礎的特點&#xff0c;幾乎每個回答都應該包括這些內容。基于 64 個…

節拍定時器是什么?

節拍定時器是什么&#xff1f; 節拍定時器&#xff08;SysTick Timer&#xff09;是嵌入式系統中用于提供精確時間基準的核心硬件組件&#xff0c;尤其在ARM Cortex-M系列處理器中廣泛應用。以下是其關鍵特性和應用的綜合說明&#xff1a; ?? 一、核心概念與工作原理 硬件基…

SDPA(Scaled Dot-Product Attention)詳解

SDPA&#xff08;Scaled Dot-Product Attention&#xff09;詳解 SDPA&#xff08;Scaled Dot-Product Attention&#xff0c;縮放點積注意力&#xff09;是 Transformer 模型的核心計算單元&#xff0c;最早由 Vaswani 等人在 2017 年的論文《Attention Is All You Need》提出…

java通過hutool工具生成二維碼實現掃碼跳轉功能

實現&#xff1a; 首先引入zxing和hutool工具依賴 <dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.2</version></dependency><dependency><groupId>com.google.zxi…

數據庫數據導出到Excel表格

1.后端代碼 第一步&#xff1a;UserMapper定義根據ID列表批量查詢用戶方法 // 批量查詢用戶信息List<User> selectUserByIds(List<Integer> ids); 第二步&#xff1a;UserMapper.xml寫動態SQL&#xff0c;實現批量查詢用戶 <!--根據Ids批量查詢用戶-->&l…

Altera系列FPGA基于ADV7180解碼PAL視頻,純verilog去隔行,提供2套Quartus工程源碼和技術支持

目錄 1、前言工程概述免責聲明 2、相關方案推薦我已有的所有工程源碼總目錄----方便你快速找到自己喜歡的項目Altera系列FPGA相關方案推薦我這里已有的PAL視頻解碼方案 3、設計思路框架工程設計原理框圖輸入PAL相機ADV7180芯片解讀BT656視頻解碼模塊圖像緩存架構輸出視頻格式轉…

【教程】Windows安全中心掃描設置排除文件

轉載請注明出處&#xff1a;小鋒學長生活大爆炸[xfxuezhagn.cn] 如果本文幫助到了你&#xff0c;歡迎[點贊、收藏、關注]哦~ 目錄 背景說明 解決方法 背景說明 即使已經把實時防護等設置全都關了&#xff0c;但Windows還是會不定時給你掃描&#xff0c;然后把風險軟件給刪了…

OPenCV CUDA模塊立體匹配------對立體匹配生成的視差圖進行雙邊濾波處理類cv::cuda::DisparityBilateralFilter

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 cv::cuda::DisparityBilateralFilter 是 OpenCV CUDA 模塊中的一個類&#xff0c;用于對立體匹配生成的視差圖進行雙邊濾波處理。這種濾波方法可…

自然語言處理期末復習

自然語言處理期末復習 一單元 自然語言處理基礎 兩個核心任務&#xff1a; 自然語言理解&#xff08;NLU, Natural Language Understanding&#xff09; 讓計算機“讀懂”人類語言&#xff0c;理解文本的語義、結構和意圖。 典型子任務包括&#xff1a;分詞、詞性標注、句法分…

黃仁勛在2025年巴黎VivaTech大會上的GTC演講:AI工廠驅動的工業革命(上)

引言 2025年6月12日,在巴黎VivaTech大會上,英偉達創始人兼CEO黃仁勛發表了題為"AI工廠驅動的工業革命"的GTC主題演講。這場持續約1小時35分鐘的演講不僅詳細闡述了英偉達在AI基礎設施、智能體技術、量子計算及機器人領域的最新突破,更系統性地勾勒出了人工智能如…

DMC-E 系列總線控制卡----雷賽板卡介紹(六)

應用軟件開發方法 DMC-E 系列總線運動控制卡的應用軟件可以在 Visual Basic 、 Visual C++ 、 C# 等高級語言 環境下開發。應用軟件開發之前,需保證 DMC-E 系列總線運動控制卡連接好從站,通過控制 卡 Motion 的 EtherCAT 總線配置界面掃描從站、設置總線通信周期…