fork()创建多个子进程

fork()创建多个子进程

在学习linux中,老师布置了一个作业:
编写一段程序,使用系统调用fork)创建两个子进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示"a";子进程分别显示字符"b“和字符"c"。试观察记录屏幕上的显示结果,并分析原因。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(){
        pid_t pid1,pid2;
        pid1=fork();
        pid2=fork();
        if(pid1<0||pid2<0){
                perror("fork error");
        }
        if(pid1==0)
        {
                printf("pid1 = b\n");
        }
        else{
                printf("father pid = a\n");
        }
        if(pid2==0){
                printf("pid2 = c\n");
        }
        else
        {
                printf("father pid = a\n");
        }
        return 0;

}

在这里插入图片描述

每次结果都不一样!!!!!

尝试分析…

先设父进程为p100,创建的两个子进程为p101,p102

Pid1=fork(),首先创建一个子进程p101,该程序会继续执行父进程,pid2=fork(),此时创建了第二个子进程p102,此时fork()返回的为创建的pid1的进程号,进入if(pid1==0)的else,执行第一个“father pid = a”,然后再判断pid2,执行第二个 “father pid = a”。

此时父进程p100结束,进入子进程pid1(p101)。根据执行结果看,内核是先执行的pid2(应该是弹栈),那么pid2又做为父进程创建子进程,返回值为子进程pid3,所以有第三个“father pid = a”,然后执行pid2=fork();

pid1=fork();的返回值为0;接下来,pid1又会创建一个子进程pid3(p103)-----执行的是pid2=fork();这一步,

、、懵逼。。。



懵逼的原因就是子进程会再创建子进程,那么不再让子生子就好了↓↓↓↓↓↓↓

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(){
       pid_t pid;
       int i=0;
   
       //父进程先创建子进程,fork()返回值为子进程的pid;然后进入子进程,此时fork()的返回值为0。然后i++,进入下一次循环,创建子进程。这样就没有子进程创建子进程了!!!
       for (i=0;i<2;i++)
       {
               pid = fork();
               if(pid==0){
                      break; //创建完子进程直接跳出循环,防止子生子
               }
       }
       // i是全局变量
       if(i==0){
               printf("b\n");
       }else if(i==1){
               printf("c\n");
       }else{
               printf("a\n");
       }
       return 0;
}

执行结果正确!!!!!!!!!!!!!!

在这里插入图片描述

进一步了解fork()原理
进一步了解fork()原理
进一步了解fork()原理

  • 15
    点赞
  • 130
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值