管道实现父子进程的信息传递(一)【fork函数、pipe函数、write/read操作、wait函数】

文章目录

  • 题目描述
  • 代码实现
  • 关于pipe函数
  • 关于读写操作
  • 关于读写端口
  • 关于wait函数
    • 功能:
    • 注意:
  • 关于fork函数


题目描述

编写一个程序,利用管道实现父子进程的通信,父进程向子进程发送信息,由子进程输出显示。

代码实现

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>  //管道功能所在的头文件
#include <sys/types.h>  //wait函数所在的头文件
#include <sys/wait.h>  //wait函数所在的头文件#define MAXLINE 80int main()
{int n;  //所发送消息的长度int fd[2];  //管道读写端口pid_t pid;  //进程号char line[MAXLINE];  //消息缓冲区if(pipe(fd) < 0) //建立管道不成功{perror("pipe");exit(1); //有错误型的退出}if((pid = fork()) < 0) //建立子进程不成功{perror("fork:");exit(1);}else  //成功建立子进程{	if(pid > 0)  //父进程{close(fd[0]);  //关闭读端write(fd[1],"I love CMY!\n", 12);  //把"I love CMY!\n"长度为12的字符送到管道写端口fd[1]close(fd[1]);   //关闭写端,老师是要求写完之后要关闭的,但是我试了试不写也没啥问题……wait(NULL);  //父进程等待子进程结束}else  //子进程{close(fd[1]);  //关闭写端n = read(fd[0], line, MAXLINE);  //从管道读端口fd[0]把长度为MAXLINE的字符送到line中write(STDOUT_FILENO, line, n);  //将line中长度为n的字符写到标准输出设备(即屏幕上)close(fd[0]);  //同上,关闭读端,老师是要求写完之后要关闭的,但是我试了试不写也没啥问题……}	}return 0;
}

关于pipe函数

功能:创建一个普通管道
在这里插入图片描述


关于读写操作

在这里插入图片描述

也就是说读/写操作的流程是:

  • 关闭读/写端
  • 进行写/读操作
  • 写/读完关闭写/读端

关于读写端口

为什么fd[0]是读,fd[1]是写,能不能颠倒过来?

一般来讲,我们常说:读写读写,不说写读写读,因为不顺口。所以0是读,1是写,你要是想颠倒也是可以的,只要你自己记得住就行。


关于wait函数

在这里插入图片描述
在这里插入图片描述

功能:

父进程一旦调用了wait就立即阻塞自己,由wait自动分析是否当前进程的某个子进程已经退出,如果让它找到了这样一个已经变成僵尸的子进程,wait就会收集这个子进程的信息,并把它彻底销毁后返回;如果没有找到这样一个子进程,wait就会一直阻塞在这里,直到有一个出现为止。

注意:

当父进程没有用wait()函数等待已终止的子进程时,子进程就会进入一种无父进程的状态,此时子进程就是僵尸进程。
如果先终止父进程,子进程依然会继续正常进行,只是它将由init进程(PID 1)继承,当子进程终止时,init进程捕获这个状态。


关于fork函数

其实本题就是管道和父子进程的相结合,重点是理解fork()之后父子进程的并行执行,以老师PPT中的例题为例:在这里插入图片描述
在这里插入图片描述

子进程执行的是 val == 0 的内容,而父进程执行的是 val > 0 的内容,子进程创建的时候完全复制了父进程的资源,可以理解为自 val = fork() 之后,代码就被copy了一份一摸一样的,父进程执行被copy的,子进程执行copy的。而对于本题而言,从

if((pid = fork()) < 0) //建立子进程不成功

开始,子进程copy了后面的代码,而且继承了父进程之前的资源,如变量等,然后在接下来的代码中根据pid的不同进入不同的代码段。

值得注意的是,本题代码中先处理的是父进程的写操作,再处理的是子进程的读操作,那如果反过来先写子进程的读操作,再写父进程的写操作,代码还可以正常运行吗?

经过测试,答案是可以,因为我们刚讲过他们俩是并行执行嘛,但是根据先写进去再读出来比较符合人类的思维,所以我们本题就先写父进程的写操作,再处理子进程的读操作~

证据如下图:
在这里插入图片描述

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

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

相关文章

基础的shell编程问题(一)

文章目录题目一题目描述代码实现关于$#的有关内容实测本程序的作用题目二题目描述代码实现注释关于argc、argv关于read函数关于文件描述符关于write函数本程序的作用题目三题目描述代码实现实测关于grep命令关于read命令题目四题目描述代码实现关于test命令实测题目一 题目描述…

基础的shell编程问题(二)

文章目录题目一题目描述代码实现结果验证关于本题题目二题目描述代码实现结果测试题目三题目描述代码实现及结果测试题目四题目描述代码实现及结果测试题目五题目描述代码实现及结果测试题目一 题目描述 输入的命令行参数必须是hello&#xff0c;才会正确显示&#xff1b;否则…

Numpy实现酒鬼漫步问题【以及randint()、where()、cumsum()、argmax()的用法详解】

文章目录题目描述代码实现关于本题涉及到的几个函数randint()where()cumsum()题目拓展题目描述代码实现题目拓展题目描述代码实现argmax()题目描述 从前有一个酒鬼&#xff0c;喝醉了行走在一条直线上&#xff0c;每走一步方向是不确定的&#xff08;向前或者向后&#xff09;…

搞清axis的含义,这一篇就够了!

文章目录axis的含义旁门左道式理解二维数组中的axis三维数组中的axis正规理解axis的含义 在自己分析之前先摆上官方关于多维数组中axis的值的定义&#xff1a; axis 0&#xff0c;表示第一个维度 axis 1&#xff0c;表示第二个维度 axis -1&#xff0c;表示最后一个维度…

Struts2.3.5+Hibernate3+Spring3.1基于注解实现的多文件上传,下载

Struts2.3.5Hibernate3Spring3.1基于注解实现的的多文件上传&#xff0c;下载,这里是上传文件到数据库中&#xff0c;上传控件可以增加和删除&#xff0c;有需要的朋友可以看看。 以下是源码下载地址&#xff1a;http://www.zuidaima.com/share/1639672872438784.htm jar包的下…

【精品计划1】动态规划入门到熟悉,看不懂来打我啊

持续更新。。。。。。 2.1斐波那契系列问题 2.2矩阵系列问题 2.3跳跃系列问题 3.1 01背包 3.2 完全背包 3.3多重背包 3.4 一些变形选讲 2.1斐波那契系列问题 在数学上&#xff0c;斐波纳契数列以如下被以递归的方法定义&#xff1a;F(0)0&#xff0c;F(1)1, F(n)F(n-1)…

【大总结2】大学两年,写了这篇几十万字的干货总结

本文是我大学两年知识的总结。涵盖数据结构、算法、语言基础、操作系统、关系数据库、NOSQL、网络/前端/项目基础知识、安全和测试、框架的学习、中间件和工具、设计模式和框架原理、我推荐的资料、我的建议 本篇文章应该算是Java后端开发技术栈的&#xff0c;但是大部分是基础…

《这是全网最硬核redis总结,谁赞成,谁反对?》六万字大合集

我摊牌了&#xff0c;这篇文章&#xff0c;值得99%的人收藏 此文后续会改为粉丝可见&#xff0c;所以喜欢的请提前关注和收藏&#xff0c;不迷路。 最近有五本我喜欢的redis实体新书&#xff0c;想要的去评论&#xff0c;我写个随机数抽奖包邮送给你。 那么&#xff0c;准备好…

Python数据预处理之异常值的处理——【自定义的three_sigma()函数、boxplot()方法】

文章目录基于3σ原则检测异常值代码实现测试基于箱型图检测异常值异常值的处理基于3σ原则检测异常值 3σ原则&#xff0c;又称拉依达准则。是指假设一组检测数据只含有随机误差。对其进行计算处理得到标准偏差&#xff0c;按一定概率确定一个区间&#xff0c;凡是超过这个区间…

那个谷歌的网红扔鸡蛋的题,来看看教科书式的回答

leetcode顶级难题&#xff0c;谷歌面试天天问&#xff0c;来看看吧&#xff0c;带你来一步一步达到最优解。 谷歌不知道问了多少遍&#xff0c;蓝桥杯也出现过&#xff0c;leetcode上是顶级难题&#xff0c;到底是什么题能如此频繁地出现&#xff1f;我们一探究竟吧。 原题描述…

不骗你,没读这一篇,你不可能懂二分

上篇文章讲动态规划获得了80k浏览&#xff0c;这次的二分也值得你们一看&#xff0c;这个系列是特别用心写的&#xff0c;准备出书的哦 动态规划 3.0 引子 图书馆自习的时候,一女生背着一堆书进阅览室,结果警报响了,大妈让女生看是哪本书把警报弄响了&#xff0c;女生把书倒出…

超硬核!操作系统学霸笔记,考试复习面试全靠它

之后会发布基于基础知识的大部分算法的模拟代码合集&#xff0c;敬请关注。 进程基础 进程的基本概念 程序顺序执行的特征&#xff1a; 1&#xff09;顺序性&#xff1a;处理机严格按照程序所规定的顺序执行&#xff0c;每一步操作必须在下一步操作开始前执行 2&#xff09;封…

超硬核!学霸把操作系统经典算法给敲完了!要知行合一

上期的笔记&#xff0c;浏览快1万了&#xff0c;既然关注的人很多&#xff0c;那就发出来承诺过的算法全模拟&#xff0c;希望帮到你们。 上期的操作系统学霸笔记&#xff0c;考试复习面试全靠它 一、模拟进程调度 功能 data.h #ifndef _Data_h_ #define _Data_h_#include …

超硬核!数据结构学霸笔记,考试面试吹牛就靠它

上次发操作系统笔记&#xff0c;很快浏览上万&#xff0c;这次数据结构比上次硬核的多哦&#xff0c;同样的会发超硬核代码&#xff0c;关注吧。 超硬核&#xff01;操作系统学霸笔记&#xff0c;考试复习面试全靠它 第一次笔记&#xff08;复习c&#xff0c;课程概述&#xff…

超硬核!小白读了这篇文章,就能在算法圈混了

作为一只超级硬核的兔子&#xff0c;从来不给你说废话&#xff0c;只有最有用的干货&#xff01;这些神级算法送给你 目录 第一节 1.1bogo排序 1.2位运算 1.3打擂台 1.4morris遍历 第二节 2.1睡眠排序 2.2会死的兔子 2.3矩阵快速幂 2.4摔手机/摔鸡蛋 时空复杂度目录 …

超硬核十万字!全网最全 数据结构 代码,随便秒杀老师/面试官,我说的

本文代码实现基本按照《数据结构》课本目录顺序&#xff0c;外加大量的复杂算法实现&#xff0c;一篇文章足够。能换你一个收藏了吧&#xff1f; 当然如果落下什么了欢迎大家评论指出 目录 顺序存储线性表实现 单链表不带头标准c语言实现 单链表不带头压缩c语言实现 约瑟…

Matplotlib——绘制图表

文章目录通过figure()函数创建画布通过subplot()函数创建单个子图通过subplots()函数创建多个子图通过add_subplot()方法添加和选中子图添加各类标签绘制常见图表绘制直方图——hist()函数绘制散点图——scatter()函数绘制柱状图——bar()函数设定线条的相关参数本地保存图片通…

Seaborn——绘制统计图形

文章目录可视化数据的分布绘制单变量分布绘制双变量分布绘制成对的双变量分布用分类数据绘图类别散点图通过stripplot()函数画散点图swarmplot()函数类别内的数据分布绘制箱型图绘制提琴图类别内的统计估计绘制条形图绘制点图可视化数据的分布 绘制单变量分布 一般采用最简单…

Bokeh——交互式可视化库

文章目录前言如何通过Plotting绘制图形前言 Bokeh是一个专门针对Web浏览器使用的交互式可视化库&#xff0c;这是与其他可视化库相比最核心的区别。 如何通过Plotting绘制图形 Plotting是以构建视觉符号为核心的接口&#xff0c;可以结合各种视觉元素&#xff08;例如&#x…

指针、引用以及const限定符、constexpr限定符

文章目录复合类型引用概念与使用引用的定义注意指针概念声明方式取地址符指针值空指针利用指针访问对象赋值和指针void* 指针指向指针的指针指向指针的引用初始化所有指针有多重含义的某些符号const限定符概念const的引用指针和const顶层const和底层constconstexpr和常量表达式…