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()原理

fork()创建多个子进程相关推荐

  1. fork创建多个子进程

    references: [1] how to create two processes from a single Parent [2] fork() in C [3] linux中fork同时创建多 ...

  2. Linux中fork()系统调用创建两个子进程

    使用系统调用fork()创建两个子进程: #include <stdio.h> #include <unistd.h>int main(){int fpid = fork(); ...

  3. linux 两个子进程,父进程创建两个子进程,在收到中断信号后杀死两个子进程

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 用fork( )创建两个子进程,再用系统调用signal( )让父进程捕捉键盘上来的中断信号(即按^c键):捕捉到中断信号后,父进程用系统调用kill(  ...

  4. linux两个子进程通信,Linux c 匿名管道实例—创建两个子进程与父进程进行管道通信...

    综合: 建立两个子进程: 一个负责计算1-50000的素数 另外一个负责计算50001-100000 父进程负责存储 利用fork创建两个子进程的框架: #include #include #incl ...

  5. linux编程两个子进程,Linux中fork同时创建多个子进程的方法

    怎么创建多个进程呢?我说那还不容易,看下边代码: //省略必要头文件 int main() { pid_t pid[2]; int i; printf("This is %d\n" ...

  6. fork 循环创建多个子进程

    循环创建多个子进程 对于以下循环创建进程是什么样的呢? int i = 0; while(i < 3){fork();/*功能代码*/i++; } 子进程创建如下图 学习笔记 对于仅含有一个 f ...

  7. linux 创建子进程,linux中fork同时创建多个子进程的方法(一)

    Fork同时创建多个子进程方法 第一种方法:验证通过 特点:同时创建多个子进程,每个子进程可以执行不同的任务,程序 可读性较好,便于分析,易扩展为多个子进程 int main(void) { prin ...

  8. 父进程创建五个子进程

    父进程创建五个子进程 #include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<sys ...

  9. python中fork创建新的进程

    为了了解其中工作原理, 在结合linux的查看进程ps命令,对进程做了进一步的理解: 1.在linux下运行.py文件,系统就会创建一个进程 # coding=utf-8 from time impo ...

最新文章

  1. 为什么大部分人做不了架构师?
  2. Java多线程:类ThreadPoolExecutor详解
  3. 多线程基础与JUC进阶笔记
  4. 分类图片展示php源码,HTML5+jQuery插件Quicksand实现超酷的星际争霸2兵种分类展示效果(附demo源码下载)...
  5. 老男孩python分享视频
  6. linux mvn m2目录,Maven C盘用户文件下没有.m2
  7. c++小游戏代码(5个) 免费
  8. mysql截止5.7版本全部异常汇总 Error SQLSTATE 中英文对照
  9. JUnit 5预期异常
  10. asp.net 设置div带颜色透明
  11. 工作流系列(4.1)-Activity表结构介绍
  12. 什么是外网IP、内网IP?
  13. wangEditor上传不了图片
  14. 自学编程难吗?如何学?
  15. 关于表的创建(第二次作业)
  16. 程序员的数学——傅里叶变换
  17. Dx bad class file magic (cafebabe) or version (0033.0000) 导致 NoClassDefFoundError 的问题
  18. java操作题35套
  19. 机器学习面试1000题 1 - 255
  20. Premiere插件大全介绍知羽,意匠,爱维,

热门文章

  1. 龙芯7A2000 CAN调试
  2. uniapp 框架下如何引入turf.js
  3. homework530
  4. 网站降权如何查询?几个方法定位网站是否被降权
  5. 事业单位计算机岗位职业职责,事业单位的四个岗位,都有哪些?具体工作职责是什么?...
  6. 七步教你从0到1创建客户服务团队
  7. 苹果设计团队正在经历重大变革:三名核心元老离职
  8. Oracle EBS中打印二维码
  9. #35 #36 k8s context 实践源码阅读 【 Go 夜读 】
  10. 理财系列 2 股票体检指标之市盈率