[問題] fork()應用實例 in C++

看板C_and_CPP作者 (阿通)時間14年前 (2011/03/30 00:04), 編輯推噓1(1031)
留言32則, 6人參與, 最新討論串1/1
#include<iostream> #include<sys/types.h> #include<unistd.h> using namespace std; int main() { fork();//產生child process cout<<"hee"<<endl; fork();//產生child process cout<<"ha"<<endl; fork();//產生child process cout<<"ho"<<endl; return 0; } 我知道結果是會輸出14個 想請問執行fork()是產生1個子程序,那現在父程序先執行完再做子程序,還是說不依定? 我實在搞不清楚這程式的流程... 雖然有輸出結果,但還是看不出所以然... 請各位幫幫忙吧 這裡貼上執行結果: [root@localhost plp411727]# ./funny hee ha ho [root@localhost plp411727]# ha ho ho hee ha ho ho ha ho ho ho -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 123.193.40.219

03/30 00:08, , 1F
通常先想辦法把程序的ID印出來看再說
03/30 00:08, 1F

03/30 00:09, , 2F
不依定,你可以印出pid幫助trace
03/30 00:09, 2F

03/30 00:10, , 3F
父子的執行順序是不一定的,除非你有用 wait 去控制
03/30 00:10, 3F

03/30 00:16, , 4F
最近才剛接觸Linux作業系統,真是不好意思,哪個指令可以印
03/30 00:16, 4F

03/30 00:16, , 5F
你可以用 getpid() 這個函式來取得 pid
03/30 00:16, 5F

03/30 00:17, , 6F
另外也有 getppid() 能取得 parent
03/30 00:17, 6F

03/30 00:30, , 7F
謝謝james732大 提供的函式,得知PID的下一步是?
03/30 00:30, 7F

03/30 00:31, , 8F
抱歉 真的很新...
03/30 00:31, 8F

03/30 00:32, , 9F
pid只是讓你了解它們之間的關係而已
03/30 00:32, 9F

03/30 00:35, , 10F
我這樣加cout<<"hee "<<getppid()<<" "<<getpid()<<endl;
03/30 00:35, 10F

03/30 00:36, , 11F
結果 hee 4786 5423
03/30 00:36, 11F

03/30 00:38, , 12F
代表的意思是?
03/30 00:38, 12F

03/30 00:45, , 13F
還是我打錯了...因為子的PPID沒有等於父的PID
03/30 00:45, 13F

03/30 00:47, , 14F
你期待會是怎麼樣的結果?
03/30 00:47, 14F

03/30 00:51, , 15F
我期待他會顯示出父的PID和子的PID 可是執行完前三行後
03/30 00:51, 15F

03/30 00:52, , 16F
之後卻都是 1 XXXX 沒有顯示子的PPID 是我哪裡打錯了?
03/30 00:52, 16F

03/30 00:56, , 17F
子的 ppid 是 1 表示他的 parent 已經執行結束了
03/30 00:56, 17F

03/30 00:56, , 18F
換句話說就是他老子已經掛掉了
03/30 00:56, 18F

03/30 01:13, , 19F
XD
03/30 01:13, 19F

03/30 01:24, , 20F
喔!原來如此 那可能在執行父程序的中間插入子程序的輸出?
03/30 01:24, 20F

03/30 01:25, , 21F
例如 一開始 hee ha ho 這樣 在hee和ha之間執行子程序?
03/30 01:25, 21F

03/30 12:28, , 22F
產生子程序之後就在跟父程序競賽了 兩個誰先執行完
03/30 12:28, 22F

03/30 12:28, , 23F
應該是不一定
03/30 12:28, 23F

03/30 12:38, , 24F
也就是程序是同時進行 但既使同時間執行到prinf();
03/30 12:38, 24F

03/30 12:41, , 25F
也會有誰較另一個快一些 較快的就先秀出字串
03/30 12:41, 25F

03/30 13:18, , 26F
錯了是cout printf();
03/30 13:18, 26F

03/30 21:06, , 27F
請問要怎麼分辨process的順序?
03/30 21:06, 27F

03/30 21:07, , 28F
請問當parent正在產生fork(),那parent會不會進入wait
03/30 21:07, 28F

03/30 21:08, , 29F
執行順序的話,沒辦法知道
03/30 21:08, 29F

03/30 21:08, , 30F
wait必須要你自己呼叫那個函式才會進入 沒呼叫就不會
03/30 21:08, 30F

03/30 21:10, , 31F
那在產生fork()時,CPU不是處於空閒狀態,那會去執行其他的
03/30 21:10, 31F

03/30 21:10, , 32F
process?
03/30 21:10, 32F
文章代碼(AID): #1DaWCV__ (C_and_CPP)