㈠ 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 c 下fork的用法
簡單的說,自 fork 調用之後的代碼,父子進程均是可見的
你的程序裡面,子進程在執行了 "i am in child" 之後,也做了一次
if < 0 ... else "in parent"
所以打了兩遍
正確的寫法應該是
pid = fork();
if (pid < 0) {
// 異常處理
}
if (0 == pid) {
// 父進程
} else {
// 子進程
}
對比一下就明白了
㈢ 請教linux下fork()創建子進程
pid = fork(); //創建進程命令點
if(pid < 0){...} //pid<0,表示fork出錯,程序一般會退出,不會出現pid=0和pid>0的情況
else if(0 == pid){...} //從這個點開始,程序出現分支 pid=0表示fork出來的子進程分支
else{....} //否則是原進程,即父進程
printf("here!"); //如果在上面兩個進程都沒有exit()操作時,執行完{}中的命令,都會走到這里
關於fork出來的父子進程關系,請仔細閱讀linux高級編程中進程一章節,內容很多,細細的閱讀並練習體會吧
㈣ linux中的fork是創建進程還是線程
fork是創建進程,pthread是線程。
㈤ 關於Linux的fork()
= OR ==
你初學者吧,請把賦值 =
和 == 值比較 搞清楚啊
= value assignment
== value compare
㈥ linux 系統 fork函數
你好!
對於剛剛接觸Unix/Linux操作系統,在Linux下編寫多進程的人來說,fork是最難理解的概念之一:它執行一次卻返回兩個值。
具體可以看我的文章http://blog.sina.com.cn/s/blog_590be5290100j14f.html
㈦ linux中的fork函數到底做了什麼事
額........每啟動一個進程並不一定要執行fork.fork只是系統最後封裝的一個系統調用.你在程序里不使用fork的話.使用其它方式啟動進程.就不是fork.fork族裡有很多函數...............exec也可替換當前進程......系統內核里生成一個進程用的是clone這個函數.
就比如要蓋個房子.一個人干,要先挖土再調水泥再擺磚頭再蓋牆這樣一步一步做.但是如果有多個人.就是可以多個人同時做這些事,一個挖土,一個調水泥.一個擺磚頭.這樣就省了很多時間.進程也是如此.fork的作用就是創建新進程.
這么多人一起蓋房子,總不能各自蓋各自的,需要大家協調來做.不能土沒挖好就擺磚,沒放磚就抹水泥一樣.這個時候需要一個工頭來管理大家.工頭通過每個人的名字來指揮每個人幹活.進程就通過pid來指揮一個進程幹活.工人需要知道自己的工頭是誰,好向他報告碰到的情況.進程需要知道自己的父進程是誰報告自己的情況.
這樣就明白fork為何要返回進程的id了吧?fork是不會返回父進程的id的.
工頭找了一個新工人幹活.從工頭知道這個新工人的名字時刻開始,新工人就會投入這個團隊一起幹活了.fork返回pid的時候就表示這個進程在這個進程團隊里了.工頭可以直接告訴工人要干什麼而不會讓其他工人誤以為這是自己的活.但是程序並沒有這么智能.這個時候就需要有一個狀態(if(!pid){....這是工人乾的活...})表明這個工人的代碼從什麼位置開始,到什麼位置結束.
㈧ linux中fork,source和exec的區別
fork是系統調用,用來創建子進程。
source 讀取函數,讀取配置文件的時候用,不創建子進程,也是'.'
exec是創建進程,但是是創建的進程取代原來的進程,
所以fork是繼承皇位,exec是推翻皇朝;
比如安卓系統中:就是用exec進行rootfs切換的;因為他用的是busybox,所以真假rootfs之間的切換用exec的;
㈨ linux下的fork()運用
fork()創建一個子進程,fork()進入內核,調用一次返回兩次,如果返回的pid == 0子進程先返回,如果pid > 0(此時返回的是子進程的pid),父進程先返回。至於子進程和父進程哪個先返回,要看內核的調度演算法。輸出次序亂序,都有可能。父進程和子進程是並發執行的。