Linux-fork()函数详解,附代码注释

//
//  main.c
//  Project_C
//
//  Created by LiJinxu on 16/8/13.
//  Copyright © 2016年 LiJinxu-NEU. All rights reserved.
//

#include <stdio.h>

int main(int argc, const char * argv[]) {
    pid_t fpid;
    /* Test Fork Part 1*/
    
    int count = 0;
    printf("The main process's ID is %d\n", getpid());
    fpid = fork();
    //1.fork:
    //fork通过系统调用创建一个与原进程几乎完全相同的进程。但是,根据参数的不同,两个进程也可以完成不同的功能。
    //一个进程调用fork后,系统会先给新进程分配资源,例如数据存储和代码空间。然后把原来的值都复制进去(不完全相同)
    //fork调用一次返回两次:
    printf("fpid : %d\n", fpid);
    if(fpid < 0)//fpid < 0 :出现错误
        printf("error in fork\n");
    else if(fpid == 0){// fpid == 0 :子进程返回 0
        printf("Child process's id is %d\n", getpid());
        printf("My parent process's id is %d\n", getppid());
        count += 1;
    }else{// fpid > 0 :父进程返回新创建的子进程的 id
        printf("Parent process's id is %d\n", getpid());
        printf("My parent process's id is %d\n", getppid());
        count += 100;
    }
    //2.fpid:其实进程间的关系,就像一个链表一样。父进程返回的是指向的子进程的id, 子进程后面没有进程返回0。
    //3.getpid: 每个进程都有一个独特的(互不相同的)进程表示符(process ID),可以通过getpid()获得。
        //3.1.getppid: 获得父进程的pid。
    //4.执行顺序:没有固定的执行顺序,先后顺序根据系统的进程调度策略。
    //5.执行结果的解释: 4868 -> 4867(par)(Main)-> 4870(child) -> 0.
        //当打印输出的时候,发现在子进程中打印其父进程的pid = 1(由之前的结果可知:应该是4867)。这是因为父进程(main进程)执行完后已经退出了, 子进程的父进程就被置成了p1,p1永远不会死亡,
    printf("Count  =  %d\n", count);
    
    
    /* Test Fork Part 2*/
    for(int i = 0 ; i < 3; i ++){
        fpid = fork();
        if(fpid == 0)
            printf("child\n");
        else if(fpid > 0)
            printf("father\n");
        else{
            printf("error\n");
        }
    }
    /*
     i = 0   ,    1   ,    2
     
     father    father     father
                          son
     
               son        father
                          son
     
     
     son       father     father
                          son
        
               son        father
                          son
     总结一下规律,对于这种N次循环的情况,执行printf函数的次数为2*(1+2+4+……+2N-1)次,创建的子进程数为1+2+4+……+2N-1个。
     
     */
    return 0;
}

 

以下转自http://blog.csdn.net/jason314/article/details/5640969

另一份代码如下:

for(i=0;i<2;i++){  
    pid_t fpid=fork();//执行完毕,i=0,fpid=3225  
    if(fpid==0)  
       printf("%d child  %4d %4d %4d/n",i,getppid(),getpid(),fpid);  
    else  
       printf("%d parent %4d %4d %4d/n",i,getppid(),getpid(),fpid);  
}  

下图清晰看出,进程之间的关系:

 

posted on 2016-08-14 11:51  暴力的轮胎  阅读(695)  评论(0编辑  收藏  举报

导航