關於fork()函數的作用


(1)    先看一個實例:

#include <unistd.h>;
#include <sys/types.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 %dn",getpid());
          else
                  printf("i am the parent process, my process id is %dn",getpid());
}
結果是
[root@localhost c]# ./a.out
i am the child process, my process id is 4286
i am the parent process, my process id is 4285 
      為什么兩行都打印出來了?在我想來,無論pid是多少,都應該僅僅有一行才對。原因在於fork之后,操作系統會復制一個與父進程全然同樣的子進程,雖說是父子關系,可是在操作系統看來,他們更像兄弟關系,這2個進程共享代碼空間,可是數據空間是互相獨立的,子進程數據空間中的內容是父進程的完整拷貝,指令指針也全然同樣,但僅僅有一點不同,假設fork成功,子進程中fork的返回值是0,父進程中fork的返回值是子進程的進程號,假設fork不成功,父進程會返回錯誤。能夠這樣想象,2個進程一直同一時候執行,並且步調一致,在fork之后,他們分別作不同的工作,也就是分岔了。這也是fork為什么叫fork的原因。
      勘誤:子進程的pid是0,子進程的getpid()是它自己的進程號;父進程中的pid值為子進程進程號,僅僅有父進程執行的getpid()才是他自己的進程號。

(2)函數原型例如以下:
#include <sys/types.h>
#include <unistd.h>
pid_t fork(void);
正確返回:在父進程中返回子進程的進程號,在子進程中返回0。功能:子進程是父進程的一個拷貝。即,子進程從父進程得到了數據段和堆棧段的拷貝,這些須要分配新的內存;而對於僅僅讀的代碼段,通常使用共享內存的方式訪問。fork返回后,子進程和父進程都從調用fork函數的下一條語句開始運行。
 #include <sys/types.h>
#include <unistd.h>
pid_t vfork(void);
正確返回:在父進程中返回子進程的進程號,在子進程中返回0
(3)fork與vfork的差別
1. fork要拷貝父進程的數據段;而vfork則不須要全然拷貝父進程的數據段,在子進程沒有調用exec和exit之前,子進程與父進程共享數據段
2. fork不正確父子進程的運行次序進行不論什么限制;而在vfork調用中,子進程先運行,父進程掛起,直到子進程調用了exec或exit之后,父子進程的運行次序才不再有限制。


參考原文:http://blog.csdn.net/yanh_lzu/archive/2008/04/21/2311644.aspx


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM