linux系统如何使用fork函数创建子进程
大家都知道linux是多進程的系統。可是,在linux中,進程是如何創建并運行的呢?
在linux系統中創建進程有兩種方式:一是由操作系統創建,二是由父進程創建進程(通常為子進程)。系統調用函數fork()是創建一個新進程的唯一方式,fork()函數是Linux系統中一個比較特殊的函數,其一次調用會有兩個返回值。
fork()函數通過系統調用創建一個與原來進程幾乎完全相同的進程。父進程調用fork()函數后,系統先給新的進程分配資源,例如存儲數據和代碼的空間。然后把原來的進程(父進程)的所有值都復制到新的新進程(子進程)中,只有少數值與原來的進程的值不同。相當于克隆了一個自己。
我們來看一個例子:
#include <unistd.h> #include <stdio.h>int main () {pid_t fpid;fpid = fork();if (fpid < 0) {printf("error in fork!");} else if (fpid == 0) {printf("this is child process, pid %d/n",getpid());} else {printf("this is parent process, pid %d/n",getpid());}return 0; }運行結果是:
this is child process, pid 5574 this is parent process, pid 5573在語句fpid=fork()之前,只有一個進程在執行這段代碼,但在這條語句之后,就變成兩個進程在執行了,這兩個進程的幾乎完全相同,將要執行的下一條語句都是if (fpid<0)……
為什么兩個進程的fpid不同呢,這與fork函數的特性有關。fork調用的一個奇妙之處就是它僅僅被調用一次,卻能夠返回兩次,它可能有三種不同的返回值:
1)在父進程中,fork返回新創建子進程的進程ID;
2)在子進程中,fork返回0;
3)如果出現錯誤,fork返回一個負值;
在fork函數執行完畢后,如果創建新進程成功,則出現兩個進程,一個是子進程,一個是父進程。在子進程中,fork函數返回0,在父進程中,fork返回新創建子進程的進程ID。我們可以通過fork返回的值來判斷當前進程是子進程還是父進程。
fork出錯可能有兩種原因:
1)當前的進程數已經達到了系統規定的上限,這時errno的值被設置為EAGAIN。
2)系統內存不足,這時errno的值被設置為ENOMEM。
創建新進程成功后,系統中出現兩個基本完全相同的進程,這兩個進程執行沒有固定的先后順序,哪個進程先執行要看系統的進程調度策略。
每個進程都有一個獨特(互不相同)的進程標識符(process ID),可以通過getpid()函數獲得,還有一個記錄父進程pid的變量,可以通過getppid()函數獲得變量的值。
參考資料:
1、http://blog.csdn.net/jason314/article/details/5640969
2、http://blog.csdn.net/cywosp/article/details/27316803
總結
以上是生活随笔為你收集整理的linux系统如何使用fork函数创建子进程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑爱好者GHOSTWIN764位V4.
- 下一篇: resize函数用法_ubound函数