Linux複習:進程二 《進程創建》《進程終止》《進程替換》《進程程序替換》

一,進程創建

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表示第一個參數要不要帶環境變量的問題。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章