Linux軟件編程-進程(2)及線程(1)

1.進程回收資源空間

(1)wait函數

頭文件:

? ? ? ?#include <sys/types.h>
#include <sys/wait.h>

函數接口:

? ? ? ?pid_t wait(int *wstatus);
功能:阻塞等待回收子進程的資源空間
參數:
wstatus :保存子進程消亡狀態的變量地址
NULL:不保存子進程退出的狀態
返回值:
成功:返回回收到的子進程的PID號
失敗:-1
wait(NULL);

基本思想:

進程同步:允許父進程暫停執行,直到其子進程終止或改變狀態

資源回收:確保子進程終止后其資源被正確釋放(防止"僵尸進程")

狀態獲取:讓父進程能夠獲取子進程的退出狀態信息

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>int main(int argc, char const *argv[])
{int *p = malloc(sizeof(int));*p = 100;pid_t pid = fork();if(pid > 0){int wstatus;pid_t pidtmp = wait(NULL);printf("pidtmp = %d\n", pidtmp);/*if (WIFEXITED(wstatus)){printf("%d over normall, state : %d\n", pidtmp, WEXITSTATUS(wstatus));}else if (WIFSIGNALED(wstatus)){printf("%d ober by signal,signal num = %d\n", pidtmp, WTERMSIG(wstatus));}*/while(1){printf("ppid = %d, pid = %d, *p = %d\n",getpid(), pid, *p);sleep(1);}}else if(0 == pid){    int i = 10;while(i--){printf("pid = %d, ppid = %d, *p = %d\n", getpid(), getppid(), *p);sleep(1);}}else{perror("fork error");exit(0);}return 0;
}

(2)waitpid函數

搭配輪詢回收

函數接口:

pid_t waitpid(pid_t pid, int *status, int options);
? ?功能:回收指定進程的資源
和wait功能相似,比wait更靈活
?參數:
pid:
<-1 回收指定進程組內的任意子進程 (-100.等待GID=100的進程組中的任意子進程)
-1 回收任意子進程,組內外
0 回收和當前調用waitpid一個組的所有子進程,組內?
> 0 回收指定ID的子進程
status 子進程退出時候的狀態,
如果不關注退出狀態用NULL;
options 選項:
0 ?表示回收過程會阻塞等待
WNOHANG 表示非阻塞模式回收資源。
? ?返回值:

? ? ? ? ? ? 成功 返回接收資源的子進程pid
失敗 ?-1
設定為非阻塞且沒有回收到子進程返回0?

(3)子進程資源空間回收策略

1. wait阻塞回收:一般情況下,父進程專門負責資源回收;
2. waitpid非阻塞方式回收:搭配輪詢方式回收。
3. 不回收:子進程的任務需要一直執行
4. 異步回收:當子進程結束時通知父進程進行回收

2.? exec : 函數族

(1)基本概念

在一個進程里面執行另外一個文件(可執行文件):
本質:將文本去的指令代碼替換成exec要執行的文件的指令。

算法思想:

不創建新進程:

與 fork() 不同,exec 不會創建新進程,只是替換當前進程的內容

參數傳遞多樣性:

列表形式(execl, execlp, execle):以 NULL 結尾的可變參數列表

數組形式(execv, execvp, execvpe):通過字符串數組傳遞參數

函數關鍵特點
execl路徑+參數列表形式,需要完整路徑
execlp文件名+參數列表形式,會在 PATH 環境變量中查找可執行文件
execle路徑+參數列表+自定義環境變量形式
execv路徑+參數數組形式,需要完整路徑
execvp文件名+參數數組形式,會在 PATH 環境變量中查找可執行文件
execvpe文件名+參數數組+自定義環境變量形式

(2)函數接口

?int execl(const char *path, const char *arg, ...? ?/* (char ?*) NULL */);
參數:

path:要執行的可執行文件的路徑和名稱
arg:執行該可執行文件時需要傳遞的參數
NULL :參數傳遞結束標志
返回值:
出錯:-1

?int execlp(const char *file, const char *arg, ...? ?/* (char ?*) NULL */);
功能:
從PATH指定的系統路徑下尋找該可執行文件
參數:
file:需要執行的可執行文件的名稱(系統路徑下已有的文件)
arg : 執行該可執行文件時需要傳遞的參數

? ? ? ?int execle(const char *path, const char *arg, ...?/*, (char *) NULL, char * const envp[] */);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execvpe(const char *file, char *const argv[], char *const envp[]);

l:list ?列表
p:path ?路徑 : 系統路徑
v:vector 容器
e:env ?環境變量

#include <stdio.h>
#include <unistd.h>int main(int argc, char const *argv[])
{//execl("/usr/bin/pstree", "pstree", "-p", NULL);char *arg[] = {"ls", "-l", NULL};//execv("/bin/ls", arg);//execlp("ls", "ls", "-l", NULL);execvp("ls", arg);return 0;
}

3.system函數

system 通過 fork-exec 啟動 shell 來執行命令(支持管道/重定向等 shell 特性),并自動處理進程等待和信號,返回命令的退出狀態;而 exec 直接替換當前進程為指定程序(不啟動 shell,無返回),需配合 fork 使用并手動管理子進程。

與exec函數族關鍵區別:

shell 處理:system 調用 /bin/sh 解析命令,exec 直接執行程序。

進程控制:system 阻塞等待命令完成,exec 替換當前進程(若成功則不返回)。

返回值:system 返回命令狀態,exec 僅在失敗時返回(成功則執行新程序)。

使用場景:system 適合簡單命令調用,exec 適合精確控制進程替換。

用execl函數實現system函數

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>int main(int argc, char const *argv[])
{pid_t pid = fork();if(pid > 0){printf("pid = %d",getpid());}else if(0 == pid){    printf("pid = %d\n", getpid());execl("/bin/ls", "ls", "-l", NULL);}else{perror("fork error");exit(0);}pid_t pidtmp = wait(NULL);printf("pidtmp = %d\n", pidtmp);return 0;
}

4.線程的基本概念

1. 什么是線程
輕量級的進程,可實現多任務的并發。
進程是操作系統資源分配的最小單位;
線程是操作系統任務調度的最小單位。? ??
2. 線程的創建
線程由某個進程創建。
進程創建線程時,會為其分配獨立的(8M)棧區空間;
線程和所在進程,以及進程中的其他線程,共用進程的堆區、數據區、文本區。

3. 線程的調度
宏觀并行,微觀串行 ? ??

4. 線程消亡
1. ?線程退出
2. 回收線程資源空間

5.進程與線程的區別

進程:

? ? ? ? ? ?進程是操作系統資源分配的最小單位;
資源消耗:進程資源開銷大,每次創建都需要有0-4G的虛擬內存空間 ??
效率角度:由操作系統創建,創建時耗時比線程大;跨進程調度比跨線程調度慢;
通信方面: 進程間不能直接通信,需要使用進程間通信機制(IPC機制)
安全性角度:進程安全性比線程高,各進程空間獨立

? ? ?

線程:

? ? ? ? ? ? ? 線程是操作系統任務調度的最小單位。
資源消耗:資源開銷較小,只需要所在進程為其開辟8M的棧區空間
效率角度:由所在進程創建;跨進程調度比跨線程調度慢;
通信方面:通信簡單,可以使用線程共享的區域進行通信(比如全局變量)
安全性角度:線程沒有進程安全性好,一個線程異常可能影響同一進程中的所有線程

6.線程的相關編程

(1)線程的創建

頭文件:

? ? ? ? ? ? #include <pthread.h>

函數接口:

? ? ? ?int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);
功能:創建一個新的線程
? 參數:
thread : 保存線程ID的變量地址
attr:線程屬性的對象地址
NULL : 按照默認屬性創建
start_routine:函數的指針:指向線程啟動后要執行的任務(線程任務函數)
arg:為線程任務函數傳遞的參數
? ? ?返回值:
成功:0
失敗:非0

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>void *tash(void *arg)
{printf("tid = %ld\n", pthread_self());
}int main(int argc, char const *argv[])
{pthread_t tid;int ret = pthread_create(&tid, NULL, tash, NULL);if(ret != 0){printf("pthread create error\n");return -1;}sleep(2);return 0;
}
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>typedef struct stu 
{int id;char name[32];float score;
}stu_t;void *tash(void *arg)
{stu_t *s = (stu_t *)arg;printf("id = %d, name = %s, score = %f\n", s->id, s->name, s->score);printf("tid = %ld\n ", pthread_self());
}int main(int argc, char const *argv[])
{pthread_t tid;stu_t s = {1, "laoliu", 99.9};int ret = pthread_create(&tid, NULL, tash, &s);if(ret != 0){printf("pthread create error\n");return -1;}sleep(2);return 0;
}

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

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

相關文章

java 集合 之 集合工具類Collections

前言早期開發者經常需要對集合進行各種操作比如排序、查找最大最小值等等但是當時沒有統一的工具類來處理所以導致代碼重復且容易出錯java.util.Collections 工具類的引入為開發者提供了大量 靜態方法 來操作集合它就像一個經驗豐富的助手和數組工具類 Arrays 一樣避免了我們重…

2025 年電賽 C 題 發揮部分 1:多正方形 / 重疊正方形高精度識別與最小邊長測量

2025 年全國大學生電子設計競賽 C 題 發揮部分 1&#xff1a;多正方形 / 重疊正方形高精度識別與最小邊長測量 香橙派 OpenCV C 全流程解析 目錄 賽題背景與需求技術難點全景圖系統總體架構硬件平臺與接線軟件架構與線程模型算法流水線逐幀拆解 6.1 圖像預處理6.2 輪廓提取與…

【自動駕駛】自動駕駛概述 ② ( 自動駕駛技術路徑 | L0 ~ L5 級別自動駕駛 )

文章目錄一、自動駕駛技術路徑1、L0 級別 自動駕駛2、L1 級別 自動駕駛3、L2 級別 自動駕駛4、L3 級別 自動駕駛5、L4 級別 自動駕駛6、L5 級別 自動駕駛一、自動駕駛技術路徑 美國汽車工程師學會 ( SAE ) 將 自動駕駛 分為 L0 ~ L5 六個級別 : 其中 L0 級別 是 完全手動 , L5…

C++少兒編程(二十二)—條件結構

1.理解條件結構小朋友們&#xff0c;今天讓我們一起來探索一個神奇而有趣的知識——程序的條件結構&#xff01;首先&#xff0c;讓我們來想象一個有趣的場景。比如說&#xff0c;你們正在準備去公園玩耍。在出發之前&#xff0c;你們會看看天氣怎么樣。如果天氣晴朗&#xff0…

Ubuntu20.04下Px4使用UORB發布消息

1 .msg文件夾定義數據類型及 變量名文件位置如圖&#xff0c;在PX4-Autopilot/msg文件夾下&#xff0c;筆者創建的文件名為gps_msg.msggps_msg.msg內容如下 uint64 timestamp # 時間戳 float32 latitude float32 longitude float32 altitude 同時&#xff0c;在CM…

three.js學習記錄(第二節:鼠標控制相機移動)

效果展示&#xff1a; 鼠標控制一、鼠標控制 - 軌道控制器&#xff08;OrbitControls&#xff09; 1. 從nodeModules中導入OrbitControls&#xff0c;OrbitControls 是一個附加組件&#xff0c;必須顯式導入 import { OrbitControls } from "three/examples/jsm/controls/…

Shortest Routes II(Floyd最短路)

題目描述There are n cities and m roads between them. Your task is to process q queries where you have to determine the length of the shortest route between two given cities.輸入The first input line has three integers n, m and q: the number of cities, roads…

分享一個基于Hadoop的二手房銷售簽約數據分析與可視化系統,基于Python可視化的二手房銷售數據分析平臺

&#x1f495;&#x1f495;作者&#xff1a;計算機源碼社 &#x1f495;&#x1f495;個人簡介&#xff1a;本人八年開發經驗&#xff0c;擅長Java、Python、PHP、.NET、Node.js、Spark、hadoop、Android、微信小程序、爬蟲、大數據、機器學習等&#xff0c;大家有這一塊的問題…

STM32的PWM

PWM作為硬件中幾乎不可或缺的存在&#xff0c;學會 PWM&#xff0c;等于打通了 STM32 的“定時器體系”。學一次&#xff0c;STM32 全系列&#xff08;甚至 AVR、PIC、ESP32&#xff09;都能通用。硬件只要一個 I/O 就能驅動功率模塊&#xff0c;非常省成本。不會 PWM&#xff…

OpenCompass傻瓜式入門教程

文章目錄1 我也許不是傻瓜&#xff0c;卻只想做個傻瓜2 環境要求3 安裝3.1 下載源碼3.2 創建虛擬環境3.3 安裝4 下載數據5 查看支持的模型和數據集6 評測6.1 指定模型路徑6.2 指定配置文件6.2.1 評測本地qwen2.5模型6.2.1.1 查看opencompass支持的qwen2.5模型6.2.1.2 創建配置文…

【軟件測試】電商購物項目-各個測試點整理(三)

目錄&#xff1a;導讀 前言一、Python編程入門到精通二、接口自動化項目實戰三、Web自動化項目實戰四、App自動化項目實戰五、一線大廠簡歷六、測試開發DevOps體系七、常用自動化測試工具八、JMeter性能測試九、總結&#xff08;尾部小驚喜&#xff09; 前言 1、優惠券的測試點…

流處理、實時分析與RAG驅動的Python ETL框架:構建智能數據管道(上)

> **2025年某電商大促,每秒20萬訂單涌入系統**——他們的風控團隊僅用**47毫秒**就識別出欺詐交易。背后的秘密武器,正是融合流處理、實時分析與RAG的下一代Python ETL框架。 ### 一、范式革命:從批處理到AI增強的ETL 4.0 #### 1.1 數據處理演進史 ```mermaid graph LR …

開源 Arkts 鴻蒙應用 開發(十五)自定義繪圖控件--儀表盤

文章的目的為了記錄使用Arkts 進行Harmony app 開發學習的經歷。本職為嵌入式軟件開發&#xff0c;公司安排開發app&#xff0c;臨時學習&#xff0c;完成app的開發。開發流程和要點有些記憶模糊&#xff0c;趕緊記錄&#xff0c;防止忘記。 相關鏈接&#xff1a; 開源 Arkts …

???????中國工業企業專利及引用被引用數據說明

1319 中國工業企業專利及引用被引用數據說明數據簡介專利近年發文趨勢及主題分布今天數據皮皮俠團隊為大家分享一份2023年12月25日最新更新的中國工業企業專利及引用被引用數據&#xff0c;供大家研究使用。數據來源原始數據來源于國家統計局&#xff0c;由皮皮俠團隊整理計算。…

MySQL知識點(上)

MySQL知識點 一&#xff1a;MySQL概述 MySQL是一款開源的數據庫軟件&#xff0c;是一種關系型數據庫管理系統&#xff08;ROBMS&#xff09;&#xff0c;也叫做表數據庫管理系統 如果需要快速安全地處理大量的數據&#xff0c;則必須使用數據庫管理系統&#xff1b;任何基于數據…

shell腳本實現sha256sum校驗并拷貝校驗通過的文件

#!/bin/bash# 目標目錄 TARGET_DIR"/appdata/jn1m/versions/old/bin"# 校驗文件 CHECKSUM_FILE"checksum.txt"# 檢查目標目錄是否存在 if [ ! -d "$TARGET_DIR" ]; thenecho "錯誤&#xff1a;目標目錄 $TARGET_DIR 不存在"exit 1 fi#…

中小型泵站物聯網智能控制系統解決方案:構建無人值守的自動化泵站體系

一、系統核心架構與功能設計1.物聯網感知層設備互聯&#xff1a;網關對接壓力傳感器、超聲波液位計、智能電表、振動傳感器等&#xff0c;實時采集水泵運行狀態&#xff08;流量、壓力、溫度、振動&#xff09;、液位、水質&#xff08;pH值、濁度&#xff09;、能耗等關鍵參數…

網絡通信---Axios

1、什么是 Axios&#xff1f; Axios? 是一個基于 ?Promise? 的 ?HTTP 客戶端&#xff0c;用于瀏覽器和 Node.js 環境&#xff0c;用來發送 ?HTTP 請求&#xff08;如 GET、POST、PUT、DELETE 等&#xff09;?。 它常用于&#xff1a; 向后臺 API 發送請求獲取數據提交表…

Ubuntu 軟件源版本不匹配導致的依賴沖突問題及解決方法

在使用 Ubuntu 系統的過程中&#xff0c;軟件包管理是日常操作的重要部分。但有時我們會遇到各種依賴沖突問題&#xff0c;其中軟件源與系統版本不匹配是常見且棘手的一種。本文就來詳細分享一次因軟件源版本不匹配引發的依賴沖突問題&#xff0c;以及具體的解決思路和流程。一…

思考:高速場景的行星輪混動效率如何理解

行星輪混動 E-CVT&#xff08;電子無級變速器&#xff09;是一種專為混合動力汽車設計的動力分配系統&#xff0c;其核心原理是通過行星齒輪組和電機的協同工作&#xff0c;實現動力分流與無級變速。 一、核心結構與組成 E-CVT的核心部件包括 行星齒輪組 和 雙電機&#xff08;…