1. wait
與 waitpid
—— 子進程資源回收
1.1 wait
pid_t wait(int *wstatus);
功能:阻塞等待,回收任意子進程的資源空間。
參數:
? ?wstatus
:保存子進程退出狀態的變量地址
? ?NULL
:不保存退出狀態
返回值:
????????成功:返回回收的子進程 PID
????????失敗:返回 -1
1.2 waitpid
pid_t waitpid(pid_t pid, int *status, int options);
功能:回收指定子進程的資源,功能比 wait
更靈活。
參數:
pid:
? ?< -1
:回收指定進程組內的任意子進程例如 -100
表示等待 GID=100 的進程組
? ?-1
:回收任意子進程(組內外)
? ?0
:回收與當前調用者同一組的所有子進程
? ?> 0
:回收指定 PID 的子進程
status:
? ? ? ?保存子進程退出狀態NULL
:不關心退出狀態
options:
? ?0
:阻塞等待WNOHANG
:非阻塞等待
返回值:
????????成功:返回回收的子進程 PID
????????失敗:-1
????????非阻塞模式下且沒有子進程退出:返回 0
1.3 子進程資源回收策略
wait 阻塞回收:父進程專門等待子進程退出
waitpid 非阻塞回收:配合輪詢實現
不回收:子進程一直運行
異步回收:子進程退出時通知父進程回收
2. exec 函數族 —— 在當前進程中執行其他程序
2.1 execl
int execl(const char *path, const char *arg, ... /* (char *) NULL */);
功能:執行指定路徑的可執行文件。
本質:將當前進程的代碼段替換成新程序,不創建新進程。
參數:
? path
:可執行文件路徑
? arg
:傳給程序的參數,第一個參數一般是程序名
? NULL
:參數結束標志
返回值:
????????成功:無返回(被新程序替換)
????????失敗:-1
2.2 execlp
int execlp(const char *file, const char *arg, ... /* (char *) NULL */);
功能:從 PATH
環境變量指定的目錄中查找可執行文件。
2.3 execle
int execle(const char *path, const char *arg, ..., (char *) NULL, char *const envp[]);
功能:指定環境變量執行新程序。
2.4 execv
int execv(const char *path, char *const argv[]);
功能:與 execl
類似,但用 數組 傳遞參數。
2.5 execvp
int execvp(const char *file, char *const argv[]);
功能:與 execlp
類似,但用 數組 傳遞參數。
2.6 execvpe
int execvpe(const char *file, char *const argv[], char *const envp[]);
功能:結合 PATH
搜索 + 指定環境變量。
3. system —— fork + exec 封裝
int system(const char *command);
功能:調用 fork()
創建子進程,并在子進程中執行 exec
族函數。
區別:
? ?exec:不創建新進程,直接替換當前進程代碼
? ?system:先 fork 再 exec,創建新的進程
4. 線程基礎
4.1 線程概念
線程:輕量級進程,是 CPU 調度的最小單位
進程:操作系統資源分配的最小單位
4.2 進程 vs 線程
特性 | 進程 | 線程 |
---|---|---|
調度單位 | 資源分配最小單位 | CPU 調度最小單位 |
資源消耗 | 創建需分配獨立虛擬地址空間(0~4G) | 僅分配棧空間(默認 8M) |
通信方式 | 需 IPC 機制 | 可直接共享全局變量 |
安全性 | 高,地址空間隔離 | 低,可能相互影響 |
創建速度 | 較慢 | 較快 |
4.3 線程創建
#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
4.4 常用線程函數
pthread_self(); // 獲取當前線程 ID
pthread_exit(); // 線程主動退出
pthread_join(); // 回收線程資源
總結
wait
/ waitpid
用于子進程資源回收
exec
族函數用于執行新程序,不會創建新進程
system
封裝了 fork
+ exec
線程是輕量級進程,開銷小但安全性低