1. 程式人生 > >關於Linux下 fork() 函數的總結

關於Linux下 fork() 函數的總結

std 下午 pro 簡單 har sin 一段 情況 當前



看這一段代碼,我想了一會兒,然後實驗了一下午。

#include <unistd.h> 
#include <stdio.h> int main() {
pid_t pid;
pid=fork();
if(pid==0){
while(1){
sleep(1);
printf("haha\n");
}
}
if(pid>0) {
while(1){
sleep(1);
printf("hehe\n
");
}
}
}

代碼顯而易懂,我開始想不明白,如果按照順序結構結構,那麽肯定會陷入死循環,要麽一直打印出haha,要麽一直打印出hehe。

事後,將代碼改了該,然後發現了一些規律,然後總結出fork() 函數的功能。

註: PID:進程號 PPID:父進程號;TIME : 占用CPU的時間

我分了以下幾種情況。

第一種: 註釋掉第一個while語句中的sleep() 函數,得到如下結果

PID PPID TIME
6060 3520 00;00;00
6061 6060 00;00;07

程序運行結果為 haha haha 。。。

第二種: 註釋掉第二個while語句中的 sleep() 函數,得到如下結果:

PID PPID TIME
6235 3520 00:00:01
6236 6235 00:00:00

程序運行結果為 hehe hehe 。。。

第三種 :保留兩個while語句的sleep()函數,得到如下結果

PID PPID TIME
6238 3520 00:00:00
6239 6328 00:00:00

程序運行結果為 : hehe haha hehe haha 。。。

其實程序很簡單,如果按照正常的程序執行順序,為順序執行,結果想了好久都想不通,終於經過一番折騰後,發現了一些信息。

很顯然,如果只保留兩個sleep中的一個,則會陷入一個死循環裏;如果兩者都保留,會交替出現所打印出的字符;顯然,sleep()函數具有使進程休眠的作用,並讓出CPU;按照這樣理解的話,交替出現字符的現象也能理解。其次,子進程是從父進程分出來的,可以從進程號中看出,而且,子進程的初始化進程號為0。從最後的結果看出,進程可以在兩者之間切換,且占用CPU的時間幾乎為0.(其實,也可以從占用CPU的時間中發現到底是哪個進程在運行)

總結一下,UNIX中的 fork()函數, procid=fork() ,這條語句的執行簡單的把稱作為 parent 的當前進程進行復制。父進程和新創建的被稱作“孩子”的進程的唯一區別是變量 procid;

父進程中它的值是子進程的進程號,而在子進程·中這個值是0.這樣就允許兩個進城都可以以確定的標識並各自運行。一般來說, fork() 語句後是如下形式:

if(procid==0) do child_processing;
else do parent processing;

  兩個進程之中的某一個,比如說子進程,可能通過在 do_child_processing 語句中的某處執行系統調用exec () 覆蓋自身。這個函數指定一個新的程序作為起參數之一,

然後新的進程作為子進程繼續執行。

關於Linux下 fork() 函數的總結