關於Linux下 fork() 函數的總結
看這一段代碼,我想了一會兒,然後實驗了一下午。
#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() 函數的總結