• 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
    ", getpid());
        fpid = fork();
        //1.fork:
        //fork通过系统调用创建一个与原进程几乎完全相同的进程。但是,根据参数的不同,两个进程也可以完成不同的功能。
        //一个进程调用fork后,系统会先给新进程分配资源,例如数据存储和代码空间。然后把原来的值都复制进去(不完全相同)
        //fork调用一次返回两次:
        printf("fpid : %d
    ", fpid);
        if(fpid < 0)//fpid < 0 :出现错误
            printf("error in fork
    ");
        else if(fpid == 0){// fpid == 0 :子进程返回 0
            printf("Child process's id is %d
    ", getpid());
            printf("My parent process's id is %d
    ", getppid());
            count += 1;
        }else{// fpid > 0 :父进程返回新创建的子进程的 id
            printf("Parent process's id is %d
    ", getpid());
            printf("My parent process's id is %d
    ", 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
    ", count);
        
        
        /* Test Fork Part 2*/
        for(int i = 0 ; i < 3; i ++){
            fpid = fork();
            if(fpid == 0)
                printf("child
    ");
            else if(fpid > 0)
                printf("father
    ");
            else{
                printf("error
    ");
            }
        }
        /*
         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);  
    }  

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

  • 相关阅读:
    Unity
    Unity
    Unity
    Unity
    Unity项目
    Unity
    UnityShader
    Unity
    【数据结构与算法】链表——奇偶链表
    【数据结构与算法】链表——分隔链表
  • 原文地址:https://www.cnblogs.com/luntai/p/5769886.html
Copyright © 2020-2023  润新知