目錄
進程控制
1.進程創建
(fork前面講過了)
寫時拷貝
進程終止
進程退出場景
退出碼
進程終止方法
進程控制
1.進程創建
(fork前面講過了)
在linux中fork函數時非常重要的函數,它從已存在進程中創建一個新進程。新進程為子進程,而原進程為父進程
#include pid_t fork(void);
返回值:自進程中返回0,父進程返回子進程id,出錯返回-1
進程調用fork,當控制轉移到內核中的fork代碼后,內核做:
- 分配新的內存塊和內核數據結構給子進程
- 將父進程部分數據結構內容(pcb?虛擬進程空間?頁表 )拷貝至子進程
- 添加子進程到系統進程列表當中
- fork返回,開始調度器調度
寫時拷貝
? ? ? ? 寫時拷貝:申請內存,發生拷貝,進行數據修改,修改頁表的物理內存,恢復權限.
并沒有對原數據區進行覆蓋
????????通常,父子代碼共享,父子再不寫入時,數據也是共享的,當任意一方試圖寫入,便以寫時拷貝的方式各自一份副本。具體見下圖:
父進程創建子進程時 ,子進程繼承的頁表中權限全是只讀的?,? 如果子進程嘗試修改,會觸發系統錯誤(因為權限都是只讀) 觸發缺頁中斷(進行系統檢測)?
????????1.子進程如果修改代碼段(代碼段不能修改),會導致子進程被殺掉
????????2.?子進程如果修改數據區,?則發生寫時拷貝,也恢復了頁表中的讀寫權限.
進程終止
進程退出場景
- 代碼運行完畢,結果正確
- 代碼運行完畢,結果不正確
- 代碼異常終止
main函數的返回值(退出碼)--->返回給父進程或者系統
echo $?? 查看最近一個進程的退出碼
退出碼
? ? ? ? 0:成功
? ? ? ? 非零:錯誤? ?不同的數字代表不同的錯誤類型
進程終止方法
- main函數return? ? ? 而其他函數return僅僅只是函數的調用結束,與main函數不同
- exit( )? ? ? ? ? ? ? ? ? ? 在代碼的任意地方表示進程結束(會將緩沖區的內容刷新出來)推薦用
- _exit( )? ? ? ? ? ? ? ? ? 不會將緩沖區的內容刷新? ? ??
exit( )是上層,_exit( )是下層?
exit()=_exit() +fllush( )
return退出? ? ?return是一種更常見的退出進程方法。執行return n等同于執行exit(n),因為調用main的運行時函數會將main的返回值當做 exit的參數。
示例
#include <unistd.h>
void exit(int status);
int main()
{printf("hello");exit(0);
}運行結果:
[root@localhost linux]# ./a.out
hello[root@localhost linux]#int main()
{printf("hello");_exit(0);
}運行結果:
[root@localhost linux]# ./a.out
[root@localhost linux]#