本文將記錄我在學習fork和wait(waitpid)這兩個函數的過程。
1.fork
在linux中,建立一個新進程常用fork函數,它非常特別,執行一次,居然返回兩個值,這與一般的函數是大大的不一樣的,這點引起了我高度的注意。
prototype: pid_t fork(void)
return: 0 ——子進程
>0(即子進程ID)——父進程
-1 ——出錯
接下來繼續介紹wait函數,最後再給出常式實踐。
2.wait
wait函數用於使父進程阻塞,直到一個子進程結束或者進程接到了一個指定的訊號為止。若父進程沒有子進程或者子進程已結束,則wait就會立即返回。
prototype : pid_t wait(int *status)
parameter: status是該子進程退出時的狀態,若為NULL,則代表任意狀態結束子進程。若不為空白,則代表指定狀態結束子進程。
return : 子進程id號 —— success
-1 —— failure
fork和wait的使用範例如下
#include <sys/types.h><br />#include <sys/wait.h><br />#include <unistd.h><br />#include <stdlib.h></p><p>int main(void)<br />{<br /> pid_t pc, pr;</p><p> pc = fork();<br /> if (0 == pc) //進入子進程<br /> {<br /> printf("i`m child process with pid of %d/n", getpid());<br /> sleep(10); //睡眠10s<br /> }<br /> else if (pc > 0) //進入父進程<br /> {<br /> pr = wait(NULL); //等待子進程結束,並取得子進程id<br /> printf("i catch child process with pid of %d/n", pr);<br /> }</p><p> return 0;<br />}
程式解釋:pc = fork();這一句建立了一個新的子進程,根據返回的值來進行判斷將要執行的是父進程還是子進程。fork()與vfork()不一樣,建立子進程之後,接著調用的是父進程還是子進程是隨機的,具體關於fork和vfork的介紹請看http://blog.csdn.net/jarvis_xian/archive/2011/05/11/6412658.aspx
既然執行父進程或者子進程的先後是隨機的,那上述常式分兩種情況論述。
1.先執行子進程
程式自上而下運行,子進程列印語句後,睡眠10s,父進程接管,等待子進程結束(睡眠結束即子進程結束),擷取結束的子進程的pid,接著列印出來。
2.先執行父進程
父進程一開始就執行wait函數,因為子進程還沒有結束(甚至還沒有開始,但是已經存在的),所以父進程在一個阻塞的狀態,既然父進程阻塞了,那就轉向執行子進程了,接下來的過程就跟第一種情況一樣了。
大家可以嘗試編譯、運行上述程式,看看效果,這對於fork和wait的作用就一目瞭然了。