linux c for()

#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,但是系統中可能同時存在多個活動的(等待執行或繼續執行的)進程。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章