fork()函數語法
表1列出了fork()函數的語法要點。
表1 fork()函數語法要點
所需頭文件 |
#include <sys/types.h> /* 提供類型pid_t的定義 */
#include <unistd.h>
|
函數原型 |
pid_t fork(void) |
函數返回值 |
0:子進程 |
子進程ID(大于0的整數):父進程 |
-1:出錯 |
fork()函數的簡單示例程序如下:
int main(void)
{
pid_t result;
/* 調用fork()函數 */
result = fork();
/* 通過result的值來判斷fork()函數的返回情況,首先進行出錯處理 */
if(result == -1)
{
printf("Fork error\n");
}
else if (result == 0) /* 返回值為0代表子進程 */
{
printf("The returned value is %d\n
In child process!!\nMy PID is %d\n",result,getpid());
}
else /* 返回值大于0代表父進程 */
{
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)技術,F在大部分嵌入式Linux系統的fork()函數調用已經采用vfork()函數的實現方式,例如uClinux所有的多進程管理都通過vfork()來實現。
本文選自華清遠見嵌入式培訓教材《從實踐中學嵌入式Linux應用程序開發》
熱點鏈接:
1、Linux下多進程編程之fork()函數說明
2、Linux下多任務系統之線程介紹
3、Linux下進程的內存結構
4、Linux下進程的創建、執行和終止
5、Linux下的進程結構
更多新聞>> |