fork创建多个子进程

references:
[1] how to create two processes from a single Parent
[2] fork() in C
[3] linux中fork同时创建多个子进程的方法

fork的本质,就是复制,把当前进程复制一份,然后两个进程并发地执行fork后面的语句,区别就是,子进程的fork返回值是0,父进程的fork返回值是子进程的pid,这也是区分父进程和子进程的方法,至于其他的内容,在fork之前的东西两个进程的一样的。

给出一个父进程和一个子进程的模板

int fd = fork();
if(fd < 0){exit(1);
} else if(fd == 0){// child code
} else {// father code
}

对于创建1个父进程和2个子进程,也是一样的道理

int fd1,fd2;fd1 = fork();
if(fd < 0){exit(1);
} else if(fd == 0){// child1 code
} else {fd2 = fork();if(fd2 < 0){exit(1);} else if(fd2 == 0){// child2 code} else {// father code}
}

先创建子进程1,然后父进程再继续执行,创建子进程2,最后,3个进程能够在框架内执行自己的代码。

这是最好用的框架,能够将3个进程都识别和区分开,不过如果创建n个子进程就会很麻烦。

因此,根据不同需求,也可以有别的写法

for(int i = 0; i < n; i++){int fd = fork();if(fd < 0){exit(1);} else if(fd == 0){// child i codebreak;} else {// father code}
}

最大作用的是break,保证子进程不会再进一步创建子进程。

然后其实子进程就可以干自己的事情了,比如执行个exec family,执行其他进程什么的。

另外值得一说的是,如果父进程没有等待子进程结束之后再结束的话,shell就会出现显示错乱。

就像下面这样,但是仅仅是显示错乱而已,你可以直接正常输入命令的。
在这里插入图片描述

reference
[1] Using fork() in simplest form need to hit enter to finish execution
[2] Why do shells call fork()?

至于为什么,那是因为,当shell执行命令的之后,也会先创建一个子shell,然后执行exec,再执行你想要执行的命令,执行结束后,再返回当前的shell。

我们用shell执行了父进程,结束后返回,就显示ss@ss:$了,而子进程仍然在执行,并且向shell输出了child process,所以就造成了上面的局面,但是仅仅是显示问题而已,正常向shell输入命令就好。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/384599.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

wait系统调用

reference:Wait System Call in C 只强调几点&#xff0c;剩下的直接看参考链接内容就好了&#xff0c;不是偷懒&#xff0c;而是里面内容写的很好了&#xff0c;没必要再写一遍了&#xff0c;这种东西就是单纯的系统调用而已&#xff0c;理解了功能&#xff0c;就完事了&#…

Linux进程间通信:共享内存与管道

references: [1] IPC through shared memory [2] Inter Process Communication (IPC) [3] https://www.geeksforgeeks.org/pipe-system-call/ [4] watch command in Linux with Examples 参考链接1和2是介绍了共享内存IPC的简单原理和相关系统调用的使用参考链接3是介绍了管道通…

find command基本使用

find命令通常用于根据文件名查找文件&#xff0c;这是最基本用法。 find [path] -name/-iname [filename] path写要查找的路径&#xff0c;自动递归查找filename写文件名&#xff0c;可以使用通配符*还有其他什么的表达式 具体细节请man find查阅文档。

正则表达式特别需要注意的点:“空“字符的匹配

在正则表达式中&#xff0c;[...]代表1个字符&#xff0c;不管里面有多少字符&#xff0c;最终这个东西的结果都是1个字符。 对于表达式[^a]表达的匹配除了a之外的字符&#xff0c;并且是1个字符。 需要注意的是&#xff0c;有些特殊字符是不会被匹配的。 我们看一个示例&am…

vim多列操作--插入/删除

插入 How to insert text at beginning of a multi-line selection in vi/VimVim Commands 删除 ctrl v使用上下左右键选中一片区域按d删除

vim进行行内某部分的复制剪切粘贴

ctrl v使用方向键选中你要复制的部分 按d&#xff08;剪切&#xff09;或者按y&#xff08;复制&#xff09;再移动到你的目标位置&#xff0c;按p粘贴&#xff08;在正常模式下才行&#xff0c;如果不是&#xff0c;先按esc&#xff09; 这个过程与你操作word文档的复制粘贴…

函数调用堆栈

基于孟宁老师的Linux内核分析 1 int g(int x){ 2 int y x 3;3 return y;4 }5 6 int f(int x){7 int z x 10;8 return g(z);9 }10 11 int main(){12 int a f(8) 1;13 return 0;14…

gdb调试的几点提示(1)

GDB debugger Examining Memory Continuing and Stepping How to translate a virtual memory address to a physical address? s和n是C语言的下一步 si和ni是汇编语言下一步 gdb能够查看的都是虚拟地址&#xff0c;不能查看物理地址&#xff0c;应用程序都不能查看物理地址…

C语言读取文件

C语言一次性读取文件 C - File I/O C library function - fread() 需要注意的点 fgets函数&#xff0c;一次只能读取一行&#xff0c;并且在结尾自动添加\0fread函数&#xff0c;可以读取很多内容&#xff0c;但是不会添加\0需要手动完成&#xff0c;具体看[参考1]

Vivado提高综合和实现的速度

让计算机的资源尽可能给vivado&#xff0c;综合、实现的时候修改一个参数 jobs改为你的计算机的最大值&#xff0c;我的计算机是12核的。 速度会快很多&#xff01;

安装Ubuntu RISC V toolchain失败(网速、git配置原因)

git获取大容量工程出错&#xff1a;RPC failed&#xff1b; curl GnuTLS recv error : Decryption has failed. error: RPC failed; curl 56 GnuTLS recv error (-54): Error in the pull function.fatal: The remote end 官方GitHub仓库 gitee镜像仓库 如果网速不够&#xff0…

Linux环境变量 set env export区别

参考链接 How to Set Environment Variables in Linux set 他能够显示当前shell的环境变量 它针对的对象是当前shell&#xff0c;如果关闭了就没了&#xff01; 直接使用set --help查看就可以。 env 显示当前用户的环境变量&#xff0c;针对的当前登录的用户 export 它能…

VirtualBox Ubuntu个人配置

注意这里VT-x启用&#xff0c;除了在BIOS启用CPU虚拟化&#xff0c;还得在命令行设置一次才可以勾选。 F:\>cd F:\VirtualBox # 进入VirtualBox安装目录F:\VirtualBox>VBoxManage.exe list vms # 查找所有虚拟机 "rhel64" {240f96d8-6535-431d-892e-b70f3dc4…

Ubuntu停止维护版本的软件源配置和系统升级方法

这里以Ubuntu 20.10版本为例&#xff08;当前是2022.2.14&#xff0c;该版本已经停止维护&#xff09;&#xff0c;我们现在需要正常使用该版本&#xff0c;并且期待升级到21.10版本&#xff0c;我们需要 配置正确是软件源升级该版本 配置正确的软件源 配置国内镜像源 我们…

优质学习内容(自用)

Verilog Verilog教程HDLBits — Verilog Practice中科大Verilog OJVerilog语法和典型电路verilog中if与case语句不完整产生锁存器的问题 Chisel chisel offcial website playground OpenXiangShan Chisel playgroundchisel IntelliJ IDEA playground library Maven libr…

diff and colordiff on Ubuntu

在Ubuntu中使用diff来对比文件差异&#xff0c;但是不是很好用&#xff0c;尤其是着色方面&#xff0c;用起来很麻烦&#xff0c;因此可以安装colordiff。 我们有两个文件file1和file2&#xff0c;使用命令 colordiff file1 file2 -y -B -W 140就可以对比文件差异&#xff0c…

基于IntelliJ IDEA和Ubuntu的Chisel开发环境搭建

注意&#xff01;本教程不是详细解说&#xff01;只说思路&#xff0c;其余请自己查阅&#xff01;不适合小白用户。 环境 Ubuntu 20.04 LTSIntelliJ IDEA 过程 在Ubuntu下安装IDEA&#xff0c;具体版本号的使用&#xff0c;请自行查阅官网安装IDEA插件&#xff0c;EasySoc…

verilator编译 更新文件的规则

本文请读者【直接关闭】&#xff0c;我后面的实践结果似乎和本文的实践结果不一样&#xff0c;真是见鬼了&#xff01;我不知道发生了什么&#xff0c;还没有来得及进一步校验&#xff01; 在其他文件不变的前提下&#xff0c;如果即将生成的mk文件和已有的mk文件不一样&#…

帮助你成为高手的视频和资料

1. 为什么大多数人不会真正成功 博客链接 视频链接 2. TED演讲&#xff1a;真正拉开你与周围人之家差距的&#xff0c;是自学能力 视频链接 3 埃隆马斯克&#xff1a;第一性原理&#xff0c;少用类比&#xff0c;类比多了就不能抓住本质了 4 如何成为一个顶尖高手 文章链…

核心思想

程序员是能够改变世界的&#xff0c;至少是改变自己的世界。 对于重复的工作&#xff0c;你可以写一个shell脚本让他自动化执行&#xff1b; 对于麻烦的工作&#xff0c;你可以看看有没有相关的插件让它操作起来更简化&#xff0c;实在不行你自己造一个&#xff1b; 程序员必…