Linux進程創建、進程等待和進程替換

1.進程創建
fork函數初識
在linux中fork函數時非常重要的函數,它從已存在進程中創建一個新進程。新進程爲子進程,而原進程爲父進程。
pid_t fork(void); 返回值:子進程中返回0,父進程返回子進程id,出錯返回-1.
進程調用fork,當控制轉移到內核中的fork代碼後,內核做:
①分配新的內存塊和內核數據結構給子進程
②將父進程部分數據結構內容拷貝至子進程
③添加子進程到系統進程列表當中
④fork返回,開始調度器調度

2.進程退出
return、_exit、exit, ctrl+c

2.1_exit函數:

 #include <unistd.h>     
 void _exit(int status);

參數:status 定義了進程的終止狀態,父進程通過wait來獲取該值
說明:雖然status是int,但是僅有低8位可以被父進程所用。所以_exit(-1)時,在終端執行$?發現返回值是255。
在這裏插入圖片描述

2.2exit函數:

#include <unistd.h>  
void exit(int status);

①執行用戶通過 atexit或on_exit定義的清理函數。
② 關閉所有打開的流,所有的緩存數據均被寫入
③調用_exit
在這裏插入圖片描述

3.進程等待
3.1進程等待必要性
①子進程退出,父進程如果不管不顧,就可能造成‘殭屍進程’的問題,進而造成內存泄漏。
②另外,進程一旦變成殭屍狀態,那就刀槍不入,“殺人不眨眼”的kill -9 也無能爲力,因爲誰也沒有辦法殺死一個已經死去的進程。
③最後,父進程派給子進程的任務完成的如何,我們需要知道。如,子進程運行完成,結果對還是不對,或者是否正常退出。
④父進程通過進程等待的方式,回收子進程資源,獲取子進程退出信息

3.2wait方法

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

返回值:成功返回被等待進程pid,失敗返回-1。
參數:輸出型參數,獲取子進程退出狀態,不關心則可以設置成爲NULL

3.3 waitpid方法

pid_ t waitpid(pid_t pid, int *status, int options);

返回值:
當正常返回的時候waitpid返回收集到的子進程的進程ID;
如果設置了選項WNOHANG,而調用中waitpid發現沒有已退出的子進程可收集,則返回0;
如果調用中出錯,則返回-1,這時errno會被設置成相應的值以指示錯誤所在;
參數:
pid:
Pid=-1,等待任一個子進程。與wait等效。
Pid>0.等待其進程ID與pid相等的子進程。
status:
WIFEXITED(status): 若爲正常終止子進程返回的狀態,則爲真。(查看進程是否是正常退出)
WEXITSTATUS(status): 若WIFEXITED非零,提取子進程退出碼。(查看進程的退出碼)
options:
WNOHANG: 若pid指定的子進程沒有結束,則waitpid()函數返回0,不予以等待。若正常結束,則返回該子進程的ID。

4.替換原理
用fork創建子進程後執行的是和父進程相同的程序(但有可能執行不同的代碼分支),子進程往往要調用一種exec函數以執行另一個程序。當進程調用一種exec函數時,該進程的用戶空間代碼和數據完全被新程序替換,從新程序的啓動例程開始執行。調用exec並不創建新進程,所以調用exec前後該進程的id並未改變。

4.1 替換函數
其實有六種以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[]);

4.2函數解釋
①這些函數如果調用成功則加載新的程序從啓動代碼開始執行,不再返回。
②如果調用出錯則返回-1
③所以exec函數只有出錯的返回值而沒有成功的返回值。

4.3命名理解
這些函數原型看起來很容易混,但只要掌握了規律就很好記。
l(list) : 表示參數採用列表
v(vector) : 參數用數組
p(path) : 有p自動搜索環境變量PATH
e(env) : 表示自己維護環境變量

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章