关于进程问题的一些思考

来源:互联网 发布:java压缩包文件名乱码 编辑:程序博客网 时间:2024/06/06 17:23

进程fork()函数可能返回三个值:
0: 该进程为子进程(因为它没有子进程,故为0)
进程标识: 该进程为父进程
负数: 创建进程失败

在做上机作业的时候,没有思考到位,导致出现了逻辑错误:
这里写图片描述

最终输出两组sub_1 一组sub_2 一组parent
期望输出为两组sub_2 一组sub_1 一组parent

后来经过实验,打印出pid1和pid2的值,发现了如下特点:
这里写图片描述

pid2是在第一个fork后定义的,所以在此产生的进程与父进程共享一个pid1的值。
图中pid为4160的进程虽然没有参与第一次进程的创建,但它从父进程中得到了这一值。

正确的逻辑:

int pid1=fork();    int pid2=fork();    int i=0;    while(i++<1)    {        if(pid2==0){        printf("this is from sub_2!pid=%d pid1=%d pid2=0\n",getpid(),pid1);        }else if(pid1==0){        printf("this is from sub_1!pid=%d pid1=0 pid2=%d\n",getpid(),pid2);        }else{        printf("this is from parent!pid=%d\n pid1=%d pid2=%d\n",getpid(),pid1,pid2);}    }

以最后创建的进程为先决条件判断。

结果

运行结果