對於主進程 fork()返回建立的子進程ID, 子進程fork()返回0
http://blog.chinaunix.net/u1/53053/showart_425189.html
進程配置有唯一的進程式控制制塊PCB,由proc結構和usr結構組成。
下面依次介紹進程相關的系統調用:
1:fork()函數 建立一個子進程
#include<sys/types.h> /* 提供類型pid_t的定義 */#include<unistd.h> /* 提供函數的定義 */pid_t fork(void);
只看fork的名字,可能難得有幾個人可以猜到它是做什麼用的。fork系統調用的作用是複製一個進程。當一個進程調用它,完成後就出現兩個幾乎一模一樣的進程,我們也由此得到了一個新進程。據說fork的名字就是來源於這個與叉子的形狀頗有幾分相似的工作流程。
在Linux 中,創造新進程的方法只有一個,就是我們正在介紹的fork。其他一些庫函數,如system(),看起來似乎它們也能建立新的進程,如果能看一下它們的源碼就會明白,它們實際上也在內部調用了fork。包括我們在命令列下運行應用程式,新的進程也是由shell調用fork製造出來的。fork有一些很有意思的特徵,下面就讓我們通過一個小程式來對它有更多的瞭解。
/* fork_test.c */#include<sys/types.h>#inlcude<unistd.h>main(){pid_t pid; /*此時僅有一個進程*/pid=fork();/*此時已經有兩個進程在同時運行*/if(pid<0)printf("error in fork!");else if(pid==0)printf("I am the child process, my process ID is %d/n",getpid());elseprintf("I am the parent process, my process ID is %d/n",getpid());} |
編譯並運行:
$gcc fork_test.c -o fork_test$./fork_testI am the parent process, my process ID is 1991I am the child process, my process ID is 1992 |
看這個程式的時候,頭腦中必須首先瞭解一個概念:在語句pid=fork()之前,只有一個進程在執行這段代碼,但在這條語句之後,就變成兩個進程在執行了,這兩個進程的代碼部分完全相同,將要執行的下一條語句都是if(pid==0)……。
兩個進程中,原先就存在的那個被稱作“父進程”,新出現的那個被稱作“子進程”。父子進程的區別除了進程標誌符(process ID)不同外,變數pid的值也不相同,pid存放的是fork的傳回值。fork調用的一個奇妙之處就是它僅僅被調用一次,卻能夠返回兩次,它可能有三種不同的傳回值:
- 在父進程中,fork返回新建立子進程的進程ID;
- 在子進程中,fork返回0;
- 如果出現錯誤,fork返回一個負值;
fork出錯可能有兩種原因:(1)當前的進程數已經達到了系統規定的上限,這時errno的值被設定為EAGAIN。(2)系統記憶體不足,這時errno的值被設定為ENOMEM。(關於errno的意義,請參考本系列的第一篇文章。)