首頁 > 軟體

Linux環境 fork() 解析

2020-06-16 17:19:33

一 基礎知識

一個進程,包括程式碼、資料和分配給進程的資源。fork()函數通過系統呼叫建立一個與原來進程幾乎完全相同的進程

fork呼叫的一個奇妙之處就是它僅僅被呼叫一次,卻能夠返回兩次,它可能有三種不同的返回值:
1)在父進程中,fork返回新建立子進程的進程ID;
2)在子進程中,fork返回0;
3)如果出現錯誤,fork返回一個負值;

範例:

/*************************************************************************
    > File Name: fork_test.c
    > Author: 
    > Mail: 
    > Created Time: 2016年06月06日 星期一 09時29分05秒
 ************************************************************************/
#include <unistd.h>  
#include <stdio.h>   
int main ()   
{   
    pid_t fpid; //fpid表示fork函數返回的值  
    int count=0;
        fpid=fork();   
        if (fpid < 0)   
            printf("error in fork!");   
        else if (fpid == 0) {  
            printf("child process| process id= %d | fpid= %d |parentid = %d n",getpid(),fpid,getppid());   
            count++;  
        }  
        else {  
            printf("parent process| process id= %d | fpid = %d |parentid = %dn",getpid(),fpid,getppid());   
            count++;  
        }
        printf("統計結果是: %d n",count);  
        getchar();
        return 0; 
}  

fork出錯可能有兩種原因:
1)當前的進程數已經達到了系統規定的上限,這時errno的值被設定為EAGAIN。
2)系統記憶體不足,這時errno的值被設定為ENOMEM。

二、fork進階知識

範例

    #include <unistd.h>  
    #include <stdio.h>  
    int main(void)  
    {  
       int i=0;  
       printf("i son/pa ppid pid  fpid n");  
       //ppid指當前進程的父進程pid  
       //pid指當前進程的pid,  
       //fpid指fork返回給當前進程的值  
       for(i=0;i<2;i++){  
           pid_t fpid=fork();  
           if(fpid==0)  
               printf("i=%d | child  ppid=%4d |pid=%4d |fpid=%4d n",i,getppid(),getpid(),fpid);  
           else  
               printf("i=%d | parent ppid=%4d |pid=%4d |fpid=%4d  n",i,getppid(),getpid(),fpid);  
       }        
       getchar();
       return 0;  
    }  

執行結果

檢視進程

分析

本文永久更新連結地址http://www.linuxidc.com/Linux/2017-03/141558.htm


IT145.com E-mail:sddin#qq.com