07LinuxC进程间通信之管道pipe多个写端或者多个读端,案例4(非常重要)_pipe可以有多个读端吗-程序员宅基地

技术标签: Linux系统编程  多进程  unix  

概述:
实际上我们多进程的管道使用时,是可以同时有多个读端和写端的。但是这个例子在平时不常用。下面我们只演示多个写端和一个读端的案例。

1 一个读端多个写端案例

是否允许,一个pipe有一个写端,多个读端呢?是否允许有一个读端多个写端呢?
前面已经说了,是允许的。

#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#include <string.h>
#include <stdlib.h>

int main(void)
{
    
	pid_t pid;
	int fd[2], i, n;
	char buf[1024];

	int ret = pipe(fd);
	if(ret == -1){
    
		perror("pipe error");
		exit(1);
	}

	for(i = 0; i < 2; i++){
    
		if((pid = fork()) == 0)
			break;
		else if(pid == -1){
    
			perror("pipe error");
			exit(1);
		}
	}

	if (i == 0) {
    			
		close(fd[0]);				
		write(fd[1], "1.hello\n", strlen("1.hello\n"));
	} else if(i == 1) {
    	
		close(fd[0]);				
		write(fd[1], "2.world\n", strlen("2.world\n"));
	} else {
    
		close(fd[1]);       //父进程关闭写端,留读端读取数据    
		//sleep(1);//不加sleep的话,可能兄进程或者弟进程某个写入后,父进程直接读,然后回收兄弟进程后就结束了。导致下一次的数据无法再读取了。
		n = read(fd[0], buf, 1024);     //从管道中读数据
		write(STDOUT_FILENO, buf, n);

		for(i = 0; i < 2; i++)		//两个儿子wait两次
			wait(NULL);
	}

	return 0;
}

可以看到,不加sleep时结果可能打印不全或者内容不一样。
在这里插入图片描述
加上sleep后。虽然结果都是hello之后才world,但是也有可能是先world才hello,只不过因为循环因为i是先创建兄进程,所以hello的先打的概率比较大。
在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_44517656/article/details/112426461

智能推荐

Qt核心机制与原理_qt原理-程序员宅基地

文章浏览阅读3.8k次,点赞5次,收藏39次。★了解Qt和C++的关系★掌握Qt的信号/槽机制的原理和使用方法★了解Qt的元对象系统★掌握Qt的架构★理解Qt的事件模型,掌握其使用的时机信号与槽、元对象系统、事件模型是Qt机制的核心,如果您想要掌握Qt编程,就需要对它们有比较深入的了解。本章重点介绍了信号与槽的基本概念和用法、元对象系统、Qt的事件模型,以及它们在实际使用过程中应注意的一些问题。Qt对标准C++的扩展标准C++对象模型为面向对象编程提供了有效的实时支持,但是它的静态特性在一些领域中表现的不够灵活。事实上,GUI应用程序_qt原理

CC2640R2F BLE5.0 TI-RTOS概述_ti rtos 总中断-程序员宅基地

文章浏览阅读8.2k次,点赞3次,收藏25次。TI-RTOS概述TI-RTOS是CC2640R2F设备上蓝牙低能耗项目的运行环境。TI-RTOS内核是传统SYS/BIOS内核的定制版本,可作为具有驱动程序,同步和调度工具的实时抢占式多线程操作系统。线程模块TI-RTOS内核管理线程执行的四个不同的任务级别,如图21所示。线程模块列表如下图所示,按照优先级降序排列。硬件中断软件中断任务后台空闲功能的空闲任务_ti rtos 总中断

按需引入element-ui找不到.babelrc_项目里面没找的.babelrc文件怎么按需引入elment-程序员宅基地

文章浏览阅读2k次,点赞2次,收藏4次。在开发过程中我们可以通过按需引入的方式引入所需要的组件,以达到减小项目体积的目的:步骤一:使用babel-plugin-component插件。运行命令行npm install babel-plugin-component -D2、修改babel.config.js文件module.exports = { presets: ['@vue/cli-plugin-babel/preset'], plugins: [ [ 'component',_项目里面没找的.babelrc文件怎么按需引入elment

Android VideoView或MediaPlayer 播放视频控制静音和正常音量模式切换_android standardgsyvideoplayer 设置静音播放-程序员宅基地

文章浏览阅读7.9k次,点赞7次,收藏11次。再做闪屏页广告的时候,如果是视频媒体,通常用户都不想听广告到底在播什么。如果是 MediaPlayer 的话设置静音模式mediaPlayer.setVolume(0f, 0f);设置有声模式mediaPlayer.setVolume(1, 1);假如是VideoView呢,MediaPlayer对象是私有成员,没办法直接获取到,咋办videoView.setOn..._android standardgsyvideoplayer 设置静音播放

JAVA8按一属性分组统计数量,JDK8:Lambda根据 单个字段、多个字段,分组求和-程序员宅基地

文章浏览阅读8.2k次,点赞2次,收藏3次。使用lambda表达式分别 根据 单个字段、多个字段,分组求和示意图:1、根据 单个字段,分组求和:根据2019这个字段,计算一个list集合里,同属于2019的某个字段累加和2、根据 多个字段,分组求和:(1)先根据2019这个字段,再根据1这个字段,计算一个list集合里,同属于2019和1的某个字段累加和;(2)先根据2019这个字段,再根据2这个字段,计算一个list集合里,同属于2019..._jdk8分组求和

双十一,站在巨人的肩膀上囤最优秀的编程书_编程屯书癖-程序员宅基地

文章浏览阅读6.9k次,点赞58次,收藏526次。双十一,囤点什么书呢?小编想了想,新书?经典书?畅销书?感觉似乎每一类都值得推荐 。每一年出版社的专业新书上百本,如何在适宜的时间选您需要的好书?双十一就是一个很好的时间选择。让小编带你浏览本年度最值得推荐的双十一好书。经典书必备(思维修炼必备)1、编程珠玑(第2版)本书是计算机科学方面的经典名著。书的内容围绕程序设计人员面对的一系列实际问题展开。作者Jon Bentley 以其独有的洞察力和创造力,引导读者理解这些问题并学会解决方法,而这些正是程序员实际编程生涯中至关重要的。本书的特._编程屯书癖

随便推点

在Vue中应用cornerstone并且实时更新缩放比例等数据_浏览器缩放倍数变化时 更新数据 vue-程序员宅基地

文章浏览阅读1.6k次。在Vue中应用cornerstone并且跟随dicom实时更新缩放比例等数据最近需要在cornerstone的显示界面中显示一些数据,比如缩放比例以及渲染时间等,但是这些是需要根据鼠标事件进行实时更新的,想想肯定是有这个接口的,于是便试了一下。1、获取到当前视窗的对象获取到视窗这个对象因为它里面肯定会有许多属性可以直接被使用,刚好我们的缩放比例就是里面的scale,还有一些属性可以直接取用。..._浏览器缩放倍数变化时 更新数据 vue

C语言中常用的函数_c语言常用函数-程序员宅基地

文章浏览阅读3.1w次,点赞135次,收藏1k次。C语言中常用的函数1、putchar()函数2、getchar()函数3、pow( a , b )函数4、sqrt( a )函数5、fabs(a)函数6、puts(字符数组)函数——输出字符串的函数7、gets(字符数组)——输入字符串的函数8、strcat(a , b)函数——字符串连接函数9、strcpy函数——字符串复制函数10、strncpy函数——字符串复制函数11、strcmp函数——字符串比较函数12、strlen函数——测量字符串长度的函数13、strlwr函数——转换为小写的函数14、_c语言常用函数

webpack打包时如何修改文件名_webpack打包文件名称设置-程序员宅基地

文章浏览阅读5k次。webpack打包时如何修改文件名在使用webpack进行项目打包的时候,我们可通过以下方式对不同类型的资源,进行文件名或文件路径的修改_webpack打包文件名称设置

android mvvm databinding在dialog中的使用_android dialog中使用datebinding-程序员宅基地

文章浏览阅读5.7k次。自定义dialog/** * Created by zhaoxiaoyu on 2019/10/31 0031. */public class CardDialog extends Dialog{ private DialogCardBinding cardBinding; private CardViewModel cardViewModel; private int num; public CardDialog(@NonNull Context context_android dialog中使用datebinding

零基础搭建服务器(DELL PowerEdge R740)_r740安装server2016-程序员宅基地

文章浏览阅读6.3w次,点赞18次,收藏78次。零基础搭建服务器(型号:DELL PowerEdge R740)step1:开机按Ctrl+R删除默认的磁盘组step2:创建虚拟磁盘step3:选择RAID5,分三个硬盘(raid-5最少需要三个),VD-size我给100G用来装系统注意有时候是现实TB如下图step4:再分个盘,用来存储数据把身下的几T都给它,直接OK就行。step5:创建热盘,选中OK,按ESC回车保存退..._r740安装server2016

数据库专业人士“采访”整理记录_访谈数据库的构建以及资料整理-程序员宅基地

文章浏览阅读950次。最近在学后台,数据表设计设计就懵了,感觉并不知道如何设计,于是在QQ上问了公司的专业人士——数据库工程师。感觉学到很多,但因为用的还不够,知识上还是匮乏阶段,所以先整理记录,慢慢消化。 问:大神,问下数据库结构如下,在实际设计中会不会使用外键呢?还是单纯使用逻辑让数据保持一致? 答:独立表,像你列举的公司表,部门表这种相互关系并不大的,一般不会用外键。有外键会影响表的删除_访谈数据库的构建以及资料整理

推荐文章

热门文章

相关标签