㈠ linux關於fork的問題
fork創建一個進程,子進程是對父進程的復制,他們有相同的代碼段和數據段等。fork執行一次返回兩次(pid == 0則返回的是子進程,pid > 0,返回的是子進程的pid),所以if和else都會執行了。不過執行的是子進程中的if(pid == 0){}和父進程中的 else{}
㈡ linux下關於的fork()問題
1、先看下wait函數的功能
進程一旦調用了 wait,就 立即阻塞自己,由wait自動分析是否當前進程的某個子進程已經退出,如果讓它找到了這樣一個已經變成僵屍的子進程,wait 就會收集這個子進程的信息, 並把它徹底銷毀後返回;如果沒有找到這樣一個子進程,wait就會一直阻塞在這里,直到有一個出現為止。wait()會暫時停止目前進程的執行,直到有信號來到或子進程結束。
2、答疑
從1可以看出,wait函數的功能不是阻止子進程退出,而是等待子進程退出時進行子進程資源回收,在子進程退出之前,阻塞父進程退出。
上例中,子進程只有一行printf輸出代碼,執行完後就自動退出了。如果要保持子進程不退出,必須在子進程內(本例是在if條件內)使用循環等方法控制,保持子進程不跳出if循環。當子進程跳出if循環時,wait等待子進程資源回收後,繼續執行fprintf(stderr,"%d process!\n",pid);,因此輸出0 process!,然後是父進程繼續退出,輸出4764 process!
㈢ linux下的fork()運用
fork()創建一個子進程,fork()進入內核,調用一次返回兩次,如果返回的pid == 0子進程先返回,如果pid > 0(此時返回的是子進程的pid),父進程先返回。至於子進程和父進程哪個先返回,要看內核的調度演算法。輸出次序亂序,都有可能。父進程和子進程是並發執行的。
㈣ 關於linux編程中fork()函數問題
第一次fork產生1個子進程,父進程的pid1為3411,子進程的pid1為0。此時已存在兩個進程。
這兩個進程分別執行pid2=fork()時,又產生兩個子進程,兩個子進程的pid2都為0;
原來兩個進程(第1次fork後)的pid2分別為兩個子進程的pid(3412,3413)
㈤ linux下的fork函數
不止三個,子進程仍然在循環體內,所以子進程也會根據它的i值來做循環,然後fork子進程的子進程,但是你的程序也有問題,父進程列印後沒有等待子進程運行結束就return了,這樣有些子進程還來不僅運行就退出了。所以你的程序的輸出結果是不可靠的,也是可能是隨機的(其結果會根據運行時操作系統的具體調度的不同而不同)。所以我給你改了一下,這樣就能讓所有被fork的子進程(包括這些子進程再次fork出來的子進程)都有機會運行。
int main()
{
int i;
int my_pid;
int chld_pid;
for( i= 0; i< 3; i++)
{
chld_pid= fork();
if(chld_pid== 0) {
my_pid = getpid();
printf("i = %d, child pid %d\n", i, my_pid);
}
else {
my_pid = getpid();
printf("i = %d, parent pid %d, child pid %d\n",i, my_pid, chld_pid);
wait(0); /*waiting for the completion of child */
}
}
return 0;
}
運行後的結果為:
i = 0, parent pid 5294, child pid 5295
i = 0, child pid 5295
i = 1, parent pid 5295, child pid 5296
i = 1, child pid 5296
i = 2, parent pid 5296, child pid 5297
i = 2, child pid 5297
i = 2, parent pid 5295, child pid 5298
i = 2, child pid 5298
i = 1, parent pid 5294, child pid 5299
i = 1, child pid 5299
i = 2, parent pid 5299, child pid 5300
i = 2, child pid 5300
i = 2, parent pid 5294, child pid 5301
i = 2, child pid 5301
這樣你就可以看到,實際上有7個子進程被fork出來,其中有3個是被真正的父進程(5294)fork出來的,而其餘的則是被5294的子進程(甚至子進程的子進程)所fork出來的。其中的邏輯關系從列印出來的進程號就可以一目瞭然了,我就不贅述了。
㈥ linux中的fork函數到底做了什麼事
額........每啟動一個進程並不一定要執行fork.fork只是系統最後封裝的一個系統調用.你在程序里不使用fork的話.使用其它方式啟動進程.就不是fork.fork族裡有很多函數...............exec也可替換當前進程......系統內核里生成一個進程用的是clone這個函數.
就比如要蓋個房子.一個人干,要先挖土再調水泥再擺磚頭再蓋牆這樣一步一步做.但是如果有多個人.就是可以多個人同時做這些事,一個挖土,一個調水泥.一個擺磚頭.這樣就省了很多時間.進程也是如此.fork的作用就是創建新進程.
這么多人一起蓋房子,總不能各自蓋各自的,需要大家協調來做.不能土沒挖好就擺磚,沒放磚就抹水泥一樣.這個時候需要一個工頭來管理大家.工頭通過每個人的名字來指揮每個人幹活.進程就通過pid來指揮一個進程幹活.工人需要知道自己的工頭是誰,好向他報告碰到的情況.進程需要知道自己的父進程是誰報告自己的情況.
這樣就明白fork為何要返回進程的id了吧?fork是不會返回父進程的id的.
工頭找了一個新工人幹活.從工頭知道這個新工人的名字時刻開始,新工人就會投入這個團隊一起幹活了.fork返回pid的時候就表示這個進程在這個進程團隊里了.工頭可以直接告訴工人要干什麼而不會讓其他工人誤以為這是自己的活.但是程序並沒有這么智能.這個時候就需要有一個狀態(if(!pid){....這是工人乾的活...})表明這個工人的代碼從什麼位置開始,到什麼位置結束.