久久人妻av一区二区软件 ,欧美日韩中文亚洲另类春色,国产欧美亚洲精品a,亚洲a∨无码男人的天堂,精品亚洲人伦一区二区三区,国产美女精品一区二区,欧美精品aaa久久久影院,成人精品天堂一区二区三区
首頁 新聞 > 科技 > 正文

FORK()函數(shù)的理解

對于剛剛接觸Unix/Linux操作系統(tǒng),在Linux下編寫多進程的人來說,fork是最難理解的概念之一:它執(zhí)行一次卻返回兩個值。

本文引用地址:http://www.eepw.com.cn/article/148649.htm

首先我們來看下fork函數(shù)的原型:

#i nclude

#i nclude

pid_t fork(void);

返回值:

負數(shù):如果出錯,則fork()返回-1,此時沒有創(chuàng)建新的進程。最初的進程仍然運行。

零:在子進程中,fork()返回0

正數(shù):在負進程中,fork()返回正的子進程的PID

其次我們來看下如何利用fork創(chuàng)建子進程。

創(chuàng)建子進程的樣板代碼如下所示:

pid_t child;

if((child = fork())0)

/*錯誤處理*/

else if(child == 0)

/*這是新進程*/

else

/*這是最初的父進程*/

fock函數(shù)調用一次卻返回兩次;向父進程返回子進程的ID,向子進程中返回0,

這是因為父進程可能存在很多過子進程,所以必須通過這個返回的子進程ID來跟蹤子進程,

而子進程只有一個父進程,他的ID可以通過getppid取得。

下面我們來對比一下兩個例子:

第一個:

#include

#include

int main()

{

pid_t pid;

int count=0;

pid = fork();

printf( This is first time, pid = %dn, pid );

printf( This is secONd time, pid = %dn, pid );

count++;

printf( count = %dn, count );

if ( pid>0 )

{

printf( This is the parent process,the child has the pid:%dn, pid );

}

else if ( !pid )

{

printf( This is the child Process.n)

}

else

{

printf( fork failed.n );

}

printf( This is third time, pid = %dn, pid );

printf( This is fouth time, pid = %dn, pid );

return 0;

}

運行結果如下:

問題:

這個結果很奇怪了,為什么printf的語句執(zhí)行兩次,而那句“count++;”的語句卻只執(zhí)行了一次

接著看:

#include

#include

int main(void)

{

pid_t pid;

int count=0;

pid = fork();

printf( Now, the pid returned by calling fork() is %dn, pid );

if ( pid>0 )

{

printf( This is the parent procESS,the child has the pid:%dn, pid );

printf( In the parent process,count = %dn, count );

}

else if ( !pid )

{

printf( This is the child process.n);

printf( Do your own things here.n );

count ++;

printf( In the child process, count = %dn, count );

}

else

{

printf( fork failed.n );

}

return 0;

}

運行結果如下:

現(xiàn)在來解釋上面提出的問題。

看這個程序的時候,頭腦中必須首先了解一個概念:在語句pid=fork()之前,只有一個進程在執(zhí)行這段代碼,但在這條語句之后,就變成兩個進程在執(zhí)行了,這兩個進程的代碼部分完全相同,將要執(zhí)行的下一條語句都是if ( pid>0 )……。

兩個進程中,原先就存在的那個被稱作“父進程”,新出現(xiàn)的那個被稱作“子進程”。父子進程的區(qū)別除了進程標志符(process ID)不同外,變量pid的值也不相同,pid存放的是fork的返回值。fork調用的一個奇妙之處就是它僅僅被調用一次,卻能夠返回兩次,它可能有三種不同的返回值:

1. 在父進程中,fork返回新創(chuàng)建子進程的進程ID;

2.在子進程中,fork返回0;

3.如果出現(xiàn)錯誤,fork返回一個負值;

fork出錯可能有兩種原因:(1)當前的進程數(shù)已經達到了系統(tǒng)規(guī)定的上限,這時errno的值被設置為EAGAIN。(2)系統(tǒng)內存不足,這時errno的值被設置為ENOMEM。

接下來我們來看看APUE2中對fork的說明:

The new process created by fork is called the child process. This function is called once but returns twice. The only difference in the returns is that the return value in the child is 0, whereas the return value in the parent is the process ID of the new child. The reason the child"s process ID is returned to the parent is that a process can have more than one child, and there is no function that allows a process to o^ain the process IDs of its children. The reason fork returns 0 to the child is that a process can have only a single parent, and the child can always call getppid to o^ain the process ID of its parent. (Process ID 0 is reserved for use by the kernel, so it"s not possible for 0 to be the process ID of a child.)

被fork創(chuàng)建的新進程叫做自進程。fork函數(shù)被調用一次,卻兩次返回。返回值唯一的區(qū)別是在子進程中返回0,而在父進程中返回子進程的pid。在父進程中要返回子進程的pid的原因是父進程可能有不止一個子進程,而一個進程又沒有任何函數(shù)可以得到他的子進程的pid。

Both the child and the parent continue executing with the instruction that follows the call to fork. The child is a copy of the parent. For example, the child gets a copy of the parent"s data space, heap, and stack. Note that this is a copy for the child; the parent and the child do not share these portions of memory. The parent and the child share the text segment (Section 7.6).

關鍵詞: 理解 函數(shù) FORK

最近更新

關于本站 管理團隊 版權申明 網站地圖 聯(lián)系合作 招聘信息

Copyright © 2005-2018 創(chuàng)投網 - www.bbcnxku.cn All rights reserved
聯(lián)系我們:33 92 950@qq.com
豫ICP備2020035879號-12

 

主站蜘蛛池模板: 奇米影视888欧美在线观看| 久久99精品国产99久久6| 亚洲色帝国综合婷婷久久| 黑人玩弄漂亮少妇高潮大叫| 超碰曰口干天天种夜夜爽| 97人妻碰碰视频免费上线 | 性刺激视频免费观看| 在线观看无码av网址| 久久不卡国产精品无码| 伊人色合天天久久综合网| 亚洲色无码专区在线观看精品| 国色天香网www在线观看| 狂野欧美激情性xxxx按摩| 久久99精品国产99久久6| 日韩少妇激情一区二区| av中文无码韩国亚洲色偷偷| 亚洲日韩欧美在线无卡| 中文成人久久久久影院免费观看| 免费人成在线视频无码| 无码午夜人妻一区二区不卡视频| 日本二区三区欧美亚洲国产| 伊人久在线观看视频| 99视频精品免视看| 国产亚洲欧洲日韩在线...| 一本久久a久久免费精品不卡| av免费无码天堂在线| 欧洲熟妇色 欧美| 亚洲国产香蕉碰碰人人| 国精品午夜福利视频导航| 欧美日韩亚洲国内综合网38c38| 午夜dj视频在线观看完整版1| 国产亚洲精aa在线观看| 午夜无码福利伦利理免| 四虎永久在线精品视频免费观看| 884aa四虎影成人精品| 亚洲中文字幕无码av在线| 亚洲人成精品久久久久桥| 亚洲欲色欲色xxxxx在线| 国产偷国产偷亚洲高清app| 精品综合久久久久久88| 18禁黄无码免费网站高潮|