linux系統編程之進程(三):進程複製fork,孤兒進程,殭屍進程

來源:互聯網
上載者:User

本節目標:

  • 複製進程映像
  • 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後子進程開始接著寫。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.