您好,登錄后才能下訂單哦!
fork:
fork用于派生一個進(jìn)程。如果成功,父進(jìn)程返回子進(jìn)程的ID,子進(jìn)程中返回0,若出錯則返回-1。
主要用途:
一個進(jìn)程希望復(fù)制自身,從而子父進(jìn)程能同時執(zhí)行不同的代碼段。
進(jìn)程想要執(zhí)行另一個程序
例如:
#include<stdio.h> #include<sys/types.h> #include<stdio.h> int main() { int count=0; pid_t pid; pid=fork(); // 創(chuàng)建一個子進(jìn)程 if(pid<0) { printf("error in fork!"); exit(1); } else if(pid==0) { printf("I am the child process,the count is %d,my process ID %d,pid=%d\n",++count,getpid(),pid); exit(0); } else printf("I am the parent process,the count is %d,my process ID %d,pid=%d\n",count,getpid(),pid); return 0; }
輸出結(jié)果:
I am the parent process,the count is 0,my process ID 13981,pid=13982 I am the child process,the count is 1,my process ID 13982,pid=0
從中可以看出,兩個進(jìn)程中,原先就存在的那個被稱為父進(jìn)程,新出現(xiàn)的那個被稱為子進(jìn)程。父子進(jìn)程的區(qū)別除了進(jìn)程標(biāo)識符(ID)不同外,變量pid的值也不同,pid存放的是fork的返回值。fork調(diào)用的一個奇妙之處就是它僅僅被調(diào)用一次,卻能返回兩次,它可能有三中不同的返回值
父進(jìn)程中,返回新建子進(jìn)程的ID
子進(jìn)程中,返回0
若出錯,則返回一個負(fù)值。
fork出錯的原因有兩種:
1. 當(dāng)前的進(jìn)程數(shù)已經(jīng)達(dá)到系統(tǒng)規(guī)定的上限,
2.系統(tǒng)內(nèi)存不足,
fork出錯的可能性很小,一般為第一種情況
vfork與fork相同,父進(jìn)程返回子進(jìn)程的ID,子進(jìn)程中返回0,若出錯則返回-1。
不同的是:
fork要拷貝父進(jìn)程的數(shù)據(jù)段;而vfork則不需要完全拷貝父進(jìn)程的數(shù)據(jù)段,在子進(jìn)程沒有調(diào)用exec或exit之前,子進(jìn)程與父進(jìn)程共享數(shù)據(jù)段。
fork不對父子進(jìn)程的執(zhí)行次序進(jìn)行任何限制,而在vfork調(diào)用中,子進(jìn)程先運(yùn)行,父進(jìn)程掛起,直到子進(jìn)程調(diào)用了exec或exit之后,父進(jìn)程的執(zhí)行次序才不再有限制。
例如:
#include<stdio.h> #include<sys/types.h> #include<unistd.h> int main(void) { int count=1; int child; printf("Before create son, the father's count is %d\n",count); child=vfork(); //創(chuàng)建了一個新的進(jìn)程,此時有兩個進(jìn)程在運(yùn)行 if(child < 0) { printf("error in vfork!\n"); exit(1); } if(child==0) { printf("This is son,his pid id %d and the count is %d\n",getpid(),++count); exit(1); } else { printf("After son, This is father,his pid is %d and the count is %d, and the child is %d\n",getpid(),count,child); } return 0; }
運(yùn)行結(jié)果:
Before create son, the father's count is 1 This is son,his pid id 14049 and the count is 2 After son, This is father,his pid is 14048 and the count is 2, and the child is 14049
從運(yùn)行結(jié)果中,我們可以看出,在子進(jìn)程中修改了count的值,但是父進(jìn)程中輸出了修改后的值2,而不是初始值1.說明子進(jìn)程和父進(jìn)程是共享count的,也就是說,由vfork創(chuàng)建出來的子進(jìn)程與父進(jìn)程之間是共享內(nèi)存區(qū)的。另外,有vfork創(chuàng)建的子進(jìn)程還會導(dǎo)致父進(jìn)程的掛起,除非子進(jìn)程執(zhí)行了exit或者execve才會喚醒父進(jìn)程。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。