#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());
els
eprintf("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.
簡單理解爲,一個進程表示的,就是一個可執行程序的一次執行過程中的一個狀態。操作系統對進程的管理,典型的情況,是通過進程表完成的。進程表中的每一個
表項,記錄的是當前操作系統中一個進程的情況。對於單 CPU的情況而言,每一特定時刻只有一個進程佔用
CPU,但是系統中可能同時存在多個活動的(等待執行或繼續執行的)進程。