系統呼叫fork

2021-09-29 09:33:15 字數 3190 閱讀 1096

fork的基本內容:

fork是依次呼叫兩次返回,分別返回在父程序和子程序中

1)在父程序中,fork返回新建立子程序的程序id;

2)在子程序中,fork返回0;

3)如果出現錯誤,fork則返回乙個負值;

例子:void fork0()

else

}在這段**中,fork()被執行後將建立與父程序相同的子程序,並返回引數。

父程序結束後shell就出來了,這是是因為父程序是當前shell命令執行的,它結束了,就返回了shell。後面是子程序繼續列印資訊。

**:void fork2()

輸出結果將會是l0,l1,bye,bye,l1,bye,bye

程序之間一旦啟動子程序,後續**就會併發,沒有先後順序

由於有if的關係,父程序有l0,l1,l2,b,子程序只有乙個b,還有乙個二階子程序有乙個b

首先父程序輸出l0,由於if中判斷是否是子程序,所以直接輸出bye,進入一階子程序,輸出l1,bye,執行fork但不進入if語句,進入二階子程序輸出l2,bye,結束。

函式名: atexit()

標頭檔案:#include

功 能: 註冊終止函式

功能很簡單,就是在exit()的時候呼叫函式,我們可以知道exit()被呼叫兩次,就是父程序一次,子程序一次。

子程序結束但父程序不結束,從而導致shell出不來了。

在乙個子程序終止前,wait使其呼叫者阻塞,而waitpid有乙個選項,可使呼叫者不阻塞;

waitpid()並不等待在其呼叫之後的第乙個終止的子程序,它有若干個選項,可以控制它所等待的程序

#define n 5

void fork10()

for (i = 0; i < n; i++)

}wifexited(status) 這個巨集用來指出子程序是否為正常退出的,如果是,它會返回乙個非零值。

結束順序不定。

父程序fork五次後,進入wait迴圈,子程序是直接執行exit的,他們無法fork()。

**void fork12()

for (i = 0; i < n; i++) r (i = 0; i < n; i++)

fork五次後子程序一直處於迴圈之中,之後父程序殺死子程序,父程序等待子程序正常結束,結束異常。殺死順序一定,而等待結束順序不一定。

**void int_handler(int sig)

void fork13()

r (i = 0; i < n; i++) r (i = 0; i < n; i++)

}kill子程序的時候產生了訊號sigint,觸發處理訊號函式int_handler提前將子程序exit,所以結束不出現異常,正常結束。

**int ccount = 0;

void child_handler(int sig)

}while (ccount > 0)

}sigchld,在乙個程序終止或者停止時,將sigchld訊號傳送給其父程序,按系統預設將忽略此訊號,如果父程序希望被告知其子系統的這種狀態,則應捕捉此訊號。

執行結果是只輸出一行後不在輸出也無法結束,似乎陷入了while迴圈之中

經過我笨拙的print引數發現sigchld只被呼叫了一次?!為什麼?

明明出現了五個exit()

這說明了掛起的訊號沒有入隊

fork後父子程序的執行時不確定的,如果子程序在父程序呼叫signal(sigchld, sig_chld)之前退出,父程序不會受到sigchld訊號。

5個子程序退出,父程序不一定會收到5個訊號,但是至少會收到乙個。

**void fork17()

if (fork() == 0) else while(1);

由該**所見,所有子程序組識別碼id與父程序組識別碼id相同。

對於程序組id,一般來說,乙個程序在shell下執行,shell程式就將該程序的pid賦給該程序的程序組id,從該程序派生的子程序都擁有父程序所屬的程序組id,除非父程序將子程序的所屬組id設定成與該子程序的pid一樣。

**16

void fork16()

if (fork() == 0) getpgrp是一種函式,功能是用來取得目前程序所屬的組識別碼。

由此可見子程序的組識別碼都是一樣的。

**void child_handler2(int sig)

void fork15()

}pause() 功能:讓程序暫停直到訊號出現。

該**中,對於父程序能同時接受幾個sigchld,並不重要,只要有乙個sigchld能到達就ok,

產生sigchld讓父程序接受的目的是為了讓父程序呼叫child——handler(),更切切的說是為了呼叫

wait()函式,而此時wait()處於while中,故會一直處理直到沒有結束的子程序時,退出。

fork系統呼叫過程

又是查詢資料,又是看原始碼,折騰了大半天,終於把fork的過程弄完了,但是後面的跟蹤狀態還不太懂,等具體後面弄清楚了,再加上。核心是2.6.11版本的。fork 系統呼叫 我們執行乙個系統呼叫時,系統將呼叫巨集指令 syscall0 define syscall0 type,name type na...

fork系統呼叫的執行過程

1.linux提供了三個系統呼叫用於建立程序,分別是fork,vfork,clone fork系統呼叫 核心採用寫時複製技術對傳統的fork函式進行了下面的優化.即子程序建立後,父子程序以唯讀的方式共享父程序的資源 並不包括父程序的頁表項 當子程序需要修改程序位址空間的某一頁時,才為子程序複製該頁....

Linux中fork 系統呼叫函式

什麼是fork 呼叫fork 發生了什麼 子程序建立後,系統會給子程序分配資源,然後把原來的程序的所有值都複製到新的子程序中,只有少數值與原來的程序的值不同 其實就是父程序的乙份副本。但是子程序和父程序駐留在不同的記憶體空間上。這些記憶體空間具有相同的內容,並且乙個程序執行的任何操作都不會影響其他程...