本節目標:
- 複製進程映像
- fork系統調用
- 孤兒進程、殭屍進程
- 寫時複製
一,進程複製(或產生)
使用fork函數得到的子進程從父進程的繼承了整個進程的地址空間,包括:進程上下文、進程堆棧、記憶體資訊、開啟的檔案描述符、訊號控制設定、進程優先順序、進程組號、當前工作目錄、根目錄、資源限制、控制終端等。
子進程與父進程的區別在於:
1、父進程設定的鎖,子進程不繼承(因為如果是排它鎖,被繼承的話,矛盾了)
2、各自的進程ID和父進程ID不同
3、子進程的未決警示被清除;
4、子進程的未決訊號集設定為空白集。
二,fork系統調用
包含標頭檔 <sys/types.h> 和 <unistd.h>
函數功能:建立一個子進程
函數原型
pid_t fork(void); //一次調用兩次傳回值,是在各自的地址空間返回,意味著現在有兩個基本一樣的進程在執行
參數:無參數。
傳回值:
- 如果成功建立一個子進程,對於父進程來說返回子進程ID
- 如果成功建立一個子進程,對於子進程來說傳回值為0
- 如果為-1表示建立失敗
流程圖:
<unistd.h><stdlib.h> ERR_EXIT(m) \ ( main(=(pid == -(pid == (pid > printf(
運行結果:
<unistd.h><stdlib.h> ERR_EXIT(m) \ ( main(=(pid == -(pid == (pid >
以上程式跟前面那個基本一致,就是讓父進程睡眠100秒,好讓子進程先退出
運行結果:
<unistd.h><stdlib.h> ERR_EXIT(m) \ ( main( val = pid =(pid == -(pid == ++ printf((pid > printf(
當調用fork時:
運行結果:
<unistd.h><stdlib.h><fcntl.h> ERR_EXIT(m) \ ( main(= open((fd == -=(pid == -(pid == ,(pid > write(fd,,
運行結果:
可知父子進程共用檔案位移指標,父進程寫完後檔案位移到parent後子進程開始接著寫。