<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > FORK()函數的理解

FORK()函數的理解

作者: 時(shí)間:2012-08-06 來(lái)源:網(wǎng)絡(luò ) 收藏

子進(jìn)程和父進(jìn)程都執行在fork調用之后的代碼,子進(jìn)程是父進(jìn)程的一個(gè)拷貝。例如,父進(jìn)程的數據空間、堆??臻g都會(huì )給子進(jìn)程一個(gè)拷貝,而不是共享這些內存。

Current implementations don't perform. a complete copy of the parent's data, stack, and heap, since a fork is often followed by an exec. Instead, a technique called copy-on-write (COW) is used. These regions are shared by the parent and the child and have their protection changed by the kernel to read-only. If either process tries to modify these regions, the kernel then makes a copy of that piece of memory only, typically a page in a virtual memory system. Section 9.2 of Bach [1986] and Sections 5.6 and 5.7 of McKusick et al. [1996] provide more detail on this feature.

我們來(lái)給出詳細的注釋

#include

#include

int main(void)

{

pid_t pid;

int count=0;

/*此處,執行fork調用,創(chuàng )建了一個(gè)新的進(jìn)程, 這個(gè)進(jìn)程共享父進(jìn)程的數據和堆??臻g等,這之后的代碼指令為子進(jìn)程創(chuàng )建了一個(gè)拷貝。 fock 調用是一個(gè)復制進(jìn)程,fock 不象線(xiàn)程需提供一個(gè)做為入口, fock調用后,新進(jìn)程的入口就在 fock的下一條語(yǔ)句。*/

pid = fork();

/*此處的pid的值,可以說(shuō)明fork調用后,目前執行的是父進(jìn)程還是子進(jìn)程*/

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

if ( pid>0 )

{

/*當fork在子進(jìn)程中返回后,fork調用又向父進(jìn)程中返回子進(jìn)程的pid, 如是該段代碼被執行,但是注意的事,count仍然為0, 因為父進(jìn)程中的count始終沒(méi)有被重新賦值, 這里就可以看出子進(jìn)程的數據和堆??臻g和父進(jìn)程是獨立的,而不是共享數據*/

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

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

}

else if ( !pid )

{ /*在子進(jìn)程中對count進(jìn)行自加1的操作,但是并沒(méi)有影響到父進(jìn)程中的count值,父進(jìn)程中的count值仍然為0*/

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;

}

也就是說(shuō),在Linux下一個(gè)進(jìn)程在內存里有三部分的數據,就是代碼段、堆棧段和數據段。代碼段,顧名思義,就是存放了程序代碼的數據,假如機器中有數個(gè)進(jìn)程運行相同的一個(gè)程序,那么它們就可以使用相同的代碼段。堆棧段存放的就是子程序的返回地址、子程序的參數以及程序的局部變量。而數據段則存放程序的全局變量,常數以及動(dòng)態(tài)數據分配的數據空間(比如用malloc之類(lèi)的取得的空間)。系統如果同時(shí)運行數個(gè)相同的程序,它們之間就不能使用同一個(gè)堆棧段和數據段。

仔細分析后,我們就可以知道:

一個(gè)程序一旦調用fork函數,系統就為一個(gè)新的進(jìn)程準備了前述三個(gè)段,首先,系統讓新的進(jìn)程與舊的進(jìn)程使用同一個(gè)代碼段,因為它們的程序還是相同的,對于數據段和堆棧段,系統則復制一份給新的進(jìn)程,這樣,父進(jìn)程的所有數據都可以留給子進(jìn)程,但是,子進(jìn)程一旦開(kāi)始運行,雖然它繼承了父進(jìn)程的一切數據,但實(shí)際上數據卻已經(jīng)分開(kāi),相互之間不再有影響了,也就是說(shuō),它們之間不再共享任何數據了。

fork()不僅創(chuàng )建出與父進(jìn)程代碼相同的子進(jìn)程,而且父進(jìn)程在fork執行點(diǎn)的所有上下文場(chǎng)景也被自動(dòng)復制到子進(jìn)程中,包括:

——全局和局部變量

——打開(kāi)的文件句柄

——共享內存、消息等同步對象

而如果兩個(gè)進(jìn)程要共享什么數據的話(huà),就要使用另一套函數(shmget,shmat,shmdt等)來(lái)操作?,F在,已經(jīng)是兩個(gè)進(jìn)程了,對于父進(jìn)程,fork函數返回了子程序的進(jìn)程號,而對于子程序,fork函數則返回零,這樣,對于程序,只要判斷fork函數的返回值,就知道自己是處于父進(jìn)程還是子進(jìn)程中。

pid控制相關(guān)文章:pid控制原理



上一頁(yè) 1 2 下一頁(yè)

關(guān)鍵詞: 理解 函數 FORK

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>