fork()函式建立子程序以後,fork拷貝了父程序的記憶體映像,這樣子程序就收到乙份父程序位址空間的拷貝,之後子程序與父程序分別在自己的位址空間執行相同的指令。
fork()的返回值是允許用來區分父程序還是子程序的。函式向父程序返回子程序的程序id,向子程序返回0,這樣就可以在**中加以區分,是建立子程序以後讓父子程序執行不同的操作了。
今天嘗試的是通過迴圈呼叫fork,產生乙個n(命令列引數)個程序組成的程序鏈和程序扇。
【程序鏈】
#include
#include
#include
int main(int argc,char* ar**)
n = atoi(ar**[1]);
for(i=1;i1--->2--->3
程式執行結果如下:
gaolu@gaolu-desktop:~$
gaolu@gaolu-desktop:~$ gcc -o process process.c
gaolu@gaolu-desktop:~$
gaolu@gaolu-desktop:~$ ./process 3
i: 3, process id: 5999, parent id: 5998.
i: 2, process id: 5998, parent id: 5997.
i: 1, process id: 5997, parent id: 5379.
gaolu@gaolu-desktop:~$ ./process 3
i: 3, process id: 6002, parent id: 6001.
i: 1, process id: 6000, parent id: 5379.
i: 2, process id: 6001, parent id: 6000.
gaolu@gaolu-desktop:~$
程式的執行結果還是帶有一定的隨機性,多謝小胖的提醒加了sleep,查閱資料發現程序排程程式選擇程序執行的順序不同可能導致訊息的輸出順序變化,如果每次父程序跳出,讓子程序sleep一定時間,訊息就會按照預想的順序輸出了。
增加sleep以後的輸出資訊:
gaolu@gaolu-desktop:~$
gaolu@gaolu-desktop:~$ gcc -o process process.c
gaolu@gaolu-desktop:~$ ./process 3
i: 1, process id: 6017, parent id: 5379.
i: 2, process id: 6018,
parent id: 1.
i: 3, process id: 6019,
parent id: 1.
【程序扇】
在上面**中只要修改判斷條件為if(!(child_pid = fork())),就可以保證每次建立子程序以後,子程序break跳出,父程序在下一輪迴圈繼續建立子程序。這樣如果輸入命令列引數3,就會形成如下程序扇:
---2 |
1--- |
---3
程式執行結果:
gaolu@gaolu-desktop:~$
gaolu@gaolu-desktop:~$ gcc -o process process.c
gaolu@gaolu-desktop:~$ ./process 3
i: 1, process id: 5913, parent id: 5912.
i: 2, process id: 5914, parent id: 5912.
i: 3, process id: 5912, parent id: 5379.
gaolu@gaolu-desktop:~$
本文出自 「淡泊明志,寧靜致遠」 部落格,請務必保留此出處
作業系統和程序
一.作業系統 1.什麼是作業系統 作業系統就是乙個協調,管理和控制計算機硬體資源和軟體資源的控制程式.在計算機硬體和使用者介面程式之間 2.作業系統的作用 1.為應用程式提供如何使用硬體資源的抽象 2.管理硬體資源 二.作業系統發展史 第一代 1940 1955 手工操作 穿孔卡片 第二代 1955...
linux程序系列 5 程序鏈與程序扇
在linux程式設計中我們或許需要建立多個程序才可以完成任務需求,那麼我們怎麼建立多個程序呢?下面我們介紹一下程序鏈與程序扇的概念 所謂程序鏈就是父程序建立乙個子程序,建立的子程序再次建立出屬於自己的子程序,這樣依次往下迴圈,如下圖所示。所謂的程序扇就是乙個父程序建立出多個子程序,如下圖所示。下面是...
作業系統實驗之程序管理
實驗內容 建立新的程序 檢視執行的程序 換出某個程序 殺死執行程序以及程序之間的通訊 下面是 include conio.h include stdio.h include stdlib.h struct pcb struct pcb neicun 20 waicun 20 int count 0,...