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()原理
fork()创建多个子进程相关推荐
- fork创建多个子进程
references: [1] how to create two processes from a single Parent [2] fork() in C [3] linux中fork同时创建多 ...
- Linux中fork()系统调用创建两个子进程
使用系统调用fork()创建两个子进程: #include <stdio.h> #include <unistd.h>int main(){int fpid = fork(); ...
- linux 两个子进程,父进程创建两个子进程,在收到中断信号后杀死两个子进程
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 用fork( )创建两个子进程,再用系统调用signal( )让父进程捕捉键盘上来的中断信号(即按^c键):捕捉到中断信号后,父进程用系统调用kill( ...
- linux两个子进程通信,Linux c 匿名管道实例—创建两个子进程与父进程进行管道通信...
综合: 建立两个子进程: 一个负责计算1-50000的素数 另外一个负责计算50001-100000 父进程负责存储 利用fork创建两个子进程的框架: #include #include #incl ...
- linux编程两个子进程,Linux中fork同时创建多个子进程的方法
怎么创建多个进程呢?我说那还不容易,看下边代码: //省略必要头文件 int main() { pid_t pid[2]; int i; printf("This is %d\n" ...
- fork 循环创建多个子进程
循环创建多个子进程 对于以下循环创建进程是什么样的呢? int i = 0; while(i < 3){fork();/*功能代码*/i++; } 子进程创建如下图 学习笔记 对于仅含有一个 f ...
- linux 创建子进程,linux中fork同时创建多个子进程的方法(一)
Fork同时创建多个子进程方法 第一种方法:验证通过 特点:同时创建多个子进程,每个子进程可以执行不同的任务,程序 可读性较好,便于分析,易扩展为多个子进程 int main(void) { prin ...
- 父进程创建五个子进程
父进程创建五个子进程 #include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<sys ...
- python中fork创建新的进程
为了了解其中工作原理, 在结合linux的查看进程ps命令,对进程做了进一步的理解: 1.在linux下运行.py文件,系统就会创建一个进程 # coding=utf-8 from time impo ...
最新文章
- 为什么大部分人做不了架构师?
- Java多线程:类ThreadPoolExecutor详解
- 多线程基础与JUC进阶笔记
- 分类图片展示php源码,HTML5+jQuery插件Quicksand实现超酷的星际争霸2兵种分类展示效果(附demo源码下载)...
- 老男孩python分享视频
- linux mvn m2目录,Maven C盘用户文件下没有.m2
- c++小游戏代码(5个) 免费
- mysql截止5.7版本全部异常汇总 Error SQLSTATE 中英文对照
- JUnit 5预期异常
- asp.net 设置div带颜色透明
- 工作流系列(4.1)-Activity表结构介绍
- 什么是外网IP、内网IP?
- wangEditor上传不了图片
- 自学编程难吗?如何学?
- 关于表的创建(第二次作业)
- 程序员的数学——傅里叶变换
- Dx bad class file magic (cafebabe) or version (0033.0000) 导致 NoClassDefFoundError 的问题
- java操作题35套
- 机器学习面试1000题 1 - 255
- Premiere插件大全介绍知羽,意匠,爱维,