一,進程創建
1.fork函數初始:
fork之後,父子進程代碼共享,數據以寫實拷貝的形式各自私有一份
2.fork的常規用法
一個父進程希望複製自己,使父子進程同時執行不同的代碼段。例如,父進程等待客戶端請求,生成子進程來處理請求。
一個進程要執行一個不同的程序。例如子進程從fork返回後,調用exec函數。
3.fork調用失敗的原因
系統中有太多的進程
實際用戶的進程數超過了限制
二,進程終止
進程退出場景
代碼運行完畢,結果正確
代碼運行完畢,結果不正確
代碼異常終止
進程常見退出方法
1.查看退出碼:echo $?
正常終止(可以通過echo $? 查看進程退出碼):
1. 從main返回 reutrn是在main中退出
3. 調用exit exit再看任何地方調用都表示進程退出
4. _exit
2.main函數的返回值 等於 退出碼
3.異常退出:
ctrl + c,信號終止
_exit函數
總結:return / exit / _exit三者的比較
return:是直接返回值
exit:是有節操的,當要終止推出一個進程的時候,他會把進程的善後工作做好,所以exit是會做收尾工作的,比如說:對緩衝區進行刷新
_exit:它是簡單粗暴,直接將進程退出
三,進程等待
1.進程等待的必要性
回收內存所對應的資源,解決內存泄露的問題
父進程通過等待的方式,回收子進程的資源,獲取子進程的退出信息
2.進程等待的方法
wite/witepid:通常是由父進程來進行操作的
1_wite
#include<sys/types.h>
#include<sys/wait.h>
pid_t wait(int*status);
返回值:
成功返回被等待進程pid,失敗返回-1。
參數:
輸出型參數,獲取子進程退出的信息,不關心則設置未NULL
我們由代碼可以看出子,當子進程退出後變成Z狀態,然後父進程在進行運行10S之後,然後在等待子進程5S之後,父進程然後5S之後退出
2_witepid
參數信息:
#include <sys/types.h>
#include <sys/wait.h>
pid_t wait(int *status);
pid_t waitpid(pid_t pid, int *status, int options);
pid_t pid:pid =-1時,等待任何一個子進程,作用與wait的作用相同
pid > 0時,等待其ID與pid相同的子進程
int *status:輸出型參數
int options(等待方式):阻塞式 和 非阻塞式【設置爲0】
3_kill -l 是查看信號的
前31個爲:普通信號
後面的爲:實時信號
//8)SIGFPE:浮點指針異常
總結:一個進程再出現異常的情況下面,出發了硬件錯誤,進而導致操作系統向該進程發信號
等待隊列:我們讓一個進程在內存中等待的隊列。
阻塞狀態:制的是當一個不滿足,讓操作系統設置爲非R狀態,並將該進程放到等待隊列,等到子進程運行結束,然後操作系統直接將進程放到運行狀態下,由調度器使用。
四,進程的程序替換
1.替換原理
用fork創建子進程後執行的是和父進程相同的程序(但有可能執行不同的代碼分支),子進程往往要調用一種exec函數以執行另一個程序。當進程調用一種exec函數時,該進程的用戶空間代碼和數據完全被新程序替換,從新程序的啓動例程開始執行。調用exec並不創建新進程,所以調用exec前後該進程的id並未改變。
2.替換函數
其實有六種以exec開頭的函數,統稱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[]);
3.函數解釋
這些函數如果調用成功則加載新的程序從啓動代碼開始執行,不再返回。
如果調用出錯則返回-1
所以exec函數只有出錯的返回值而沒有成功的返回值。
4.命名理解
這些函數原型看起來很容易混,但只要掌握了規律就很好記。
l(list) : 表示參數採用列表
v(vector) : 參數用數組
p(path) : 有p自動搜索環境變量PATH
e(env) : 表示自己維護環境變量
P:帶P和不帶P表示第一個參數要不要帶路徑的問題。
L:
L和V表示傳參的形式是採用列表的形式還是採用數組的形式
V:
E:帶E和不帶E表示第一個參數要不要帶環境變量的問題。