天天看點

linux程序fork,Linux下多程序程式設計之fork()函數文法

fork()函數文法

表1列出了fork()函數的文法要點。

表1 fork()函數文法要點

所需頭檔案

#include

#include

函數原型

pid_t fork(void)

函數傳回值

0:子程序

子程序ID(大于0的整數):父程序

-1:出錯

fork()函數的簡單示例程式如下:

int main(void)

{

pid_t result;

result = fork();

if(result == -1)

{

printf("Fork error\n");

}

else if (result == 0)

{

printf("The returned value is %d\n

In child process!!\nMy PID is %d\n",result,getpid());

}

else

{

printf("The returned value is %d\n

In father process!!\nMy PID is %d\n",result,getpid());

}

return result;

}

将可執行程式下載下傳到目标闆上,運作結果如下:

$ arm-linux-gcc fork.c –o fork (或者修改Makefile)

$ ./fork

The returned value is 76

In father process!!

My PID is 75

The returned value is :0

In child process!!

My PID is 76

從該執行個體中可以看出,使用fork()函數建立了一個子程序,其中的父程序傳回子程序的程序号,而子程序的傳回值為0。

由于fork()完整地複制了父程序的整個位址空間,是以執行速度是比較慢的。為了加快fork()的執行速度,很多UNIX系統設計者建立了vfork()。vfork()也能建立新程序,但它不産生父程序的副本。它是通過允許父子程序可通路相同實體記憶體,進而僞裝了對程序位址空間的真實複制,當子程序需要改變記憶體中的資料時才複制父程序。這就是著名的“寫操作時複制”(copy-on-write)技術。現在大部分嵌入式Linux系統的fork()函數調用已經采用vfork()函數的實作方式,例如uClinux所有的多程序管理都通過vfork()來實作。

熱點連結: