Linux 进程的管道通信

news2024/9/29 23:57:30

文章目录

    • 无名管道pipe
    • 有名管道

进程之间的通信:Linux环境下,进程地址空间相互独立,每个进程各自有不同的用户地址空间。任何一个进程的全局变量在另外一个进程中都看不到,所以进程之间不能相互访问,要交换数据必须通过内核。如图,在内核中开辟一块缓冲区,进程1把数据从用户空间拷贝到内核缓冲区,进程2在从内核缓冲区中把数据读走,内核提供的这种机制称为进程间通信IPC(InterProcess Communication)

在这里插入图片描述

  • 管道是LInux/Unix最经典的一种通信方式,管道实质上是父子进程借助内存文件的一种通信方式。借助进程映像加载等手段,它可以实现两个程序之间的数据交换。
  • 管道的本质是一块内核缓冲区,由两根文件描述符引用,一个表示读端,一个表示写端,规定数据从管道的写端流入管道,从读端流出。当两根进程都终结的时候,管道会自动消失。默认的,管道的读端和写端都是堵塞的。
  • 管道包括两种:无名管道和有名管道。

无名管道pipe

使用无名管道时,还可以搭配使用close()关闭文件描述符和dup()复制管道文件描述符来实现输入输出标准的重定向。

#include<unistd.h>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>

int main(){
	int data_processed;
	int file_pipes[2];
	const char some_data[]="123";
	char buffer[BUFSIZ+1];
	
	memset(buffer,'\0',sizeof(buffer));

	if(pipe(file_pipes)==0){
		data_processed=write(file_pipes[1],some_data,strlen(some_data));
		printf("Wrote %d bytes\n",data_processed);
		data_processed=read(file_pipes[0],buffer,BUFSIZ);
		printf("Read %d bytes:%s\n",data_processed,buffer);
		exit(EXIT_SUCCESS);
	
	}
	exit(EXIT_FAILURE);
}
[cch@aubin os]$ gcc demo.c
[cch@aubin os]$ ./a.out
Wrote 3 bytes
Read 3 bytes:123
[cch@aubin os]$ 
  • menset是c语言的初始化函数,作用是将某一块内存中的内容全部设置为指定的值,这个函数通常为新申请的内存做初始化工作。void *memset(void *s, int ch, size_t n);将s中当前位置后面的n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s 。
  • int pipe(int fd[2])用于创建一个管道,如果函数调用成功,fd[0]存放管道的读端,fd[1]存放管道的写端(都是文件描述符),并且返回0,如果失败则返回-1,并设置errno值。

当父进程使用pipe创建管道之后,一般需要再fork一个子进程,然后通过管道实现父子进程之间的通信。一般来说只要两个进程有血缘关系(有共同的祖先),就可以使用管道进行通信。

  • 父进程创建管道
    在这里插入图片描述
  • 父进程fork子进程
    在这里插入图片描述
  • 父进程关闭读端,子进程关闭写端,实现进程之间通信
    在这里插入图片描述
#include<unistd.h>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>

int main(){
	int data_processed;
	int file_pipes[2];
	const char some_data[]="123";
	char buffer[BUFSIZ+1];
	pid_t fork_result;
	
	memset(buffer,'\0',sizeof(buffer));

	if(pipe(file_pipes)==0){
		fork_result=fork();
		if(fork_result==-1){
			fprintf(stderr,"Fork failure");
			exit(EXIT_FAILURE);
		}

		//子进程
		if(fork_result==0){
			data_processed=read(file_pipes[0],buffer,BUFSIZ);
			printf("son:Read %d bytes:%s\n",data_processed,buffer);
			exit(EXIT_SUCCESS);
		}else{
			data_processed=write(file_pipes[1],some_data,strlen(some_data));
			printf("father:Wrote %d bytes\n",data_processed);
		}
		
		
		exit(EXIT_SUCCESS);
	
	}
	exit(EXIT_FAILURE);
}
[cch@aubin os]$ gcc demo.c
[cch@aubin os]$ ./a.out
father:Wrote 3 bytes
son:Read 3 bytes:123
[cch@aubin os]$ 

管道实现程序之间的通信

//pipe4.c
#include<unistd.h>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>

int main(int argc,char *argv[]){
	int data_processed;
	char buffer[BUFSIZ+1];
	int file_descriptor;
	
	memset(buffer,'\0',sizeof(buffer));
	sscanf(argv[1],"%d",&file_descriptor);//读取格式化的argv[1]给file_descriptor
	data_processed=read(file_descriptor,buffer,BUFSIZ);
	printf("%d-read %d bytes:%s\n",getpid(),data_processed,buffer);
	exit(EXIT_FAILURE);

}
# 0表示键盘,从键盘中读取输入并且输出
[cch@aubin os]$gcc pipe4.c -o pipe
[cch@aubin os]$ ./pipe 0
123466
4947-read 7 bytes:123466

[cch@aubin os]$ 
#include<unistd.h>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>

int main(){
	int data_processed;
	int file_pipes[2];
	const char some_data[]="123";
	char buffer[BUFSIZ+1];
	pid_t fork_result;
	
	memset(buffer,'\0',sizeof(buffer));

	if(pipe(file_pipes)==0){
		fork_result=fork();
		if(fork_result==-1){
			fprintf(stderr,"Fork failure");
			exit(EXIT_FAILURE);
		}

		//子进程
		if(fork_result==0){
			sprintf(buffer,"%d",file_pipes[0]);//将file_pipes[0]转换成字符串,以适应execl调用中参数类型的要求,其中fotmat参数与print中的类型一致
			/*
				execlp("ls", "ls", "-l", "-F", NULL);         使用程序名在PATH中搜索。
				execl("/bin/ls", "ls", "-l", "-F", NULL);    使用参数1给出的绝对路径搜索。
			*/

			if(execl("pipe","pipe",buffer,(char *)0)==-1)
				printf("execl error\n");
			exit(EXIT_FAILURE);

		}else{
			data_processed=write(file_pipes[1],some_data,strlen(some_data));
			printf("father:Wrote %d bytes\n",data_processed);
		}
		
		
		exit(EXIT_SUCCESS);
	
	}
	exit(EXIT_FAILURE);
}
[cch@aubin os]$ gcc demo.c
[cch@aubin os]$ ./a.out
father:Wrote 3 bytes
argv[1]=3
6098-read 3 bytes:123
[cch@aubin os]$ 

有名管道

有名管道可以实现两个没有血缘关系的进程进行通信。

[cch@aubin s]$ mkfifo pp
[cch@aubin s]$ ls -la
总用量 44
drwxrwxr-x. 2 cch cch    80 117 11:01 .
drwxr-xr-x. 5 cch cch    72 1014 20:04 ..
-rwxrwxr-x. 1 cch cch 14176 1023 19:09 a.out
-rw-r--r--. 1 cch cch 12288 1014 17:17 .cc.c.swp
-rw-------. 1 cch cch 12288 1012 17:05 .file1.c.swp
-rw-rw-r--. 1 cch cch   206 117 11:00 file.c
prw-rw-r--. 1 cch cch     0 117 11:01 pp

可以看到,当使用mkfifo创建有名管道后,管道文件的信息的第一个显示为p,表示其为管道文件

[cch@aubin s]$ echo "hhhhsjiqq">pp

在命令行内输入以上,一开始管道会堵塞,因为它会等待一个进程读取数据

[cch@aubin s]$ cat pp
hhhhsjiqq
[cch@aubin s]$ 

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

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

相关文章

分享68个毕业答辩PPT,总有一款适合您

分享68个毕业答辩PPT&#xff0c;总有一款适合您 链接&#xff1a;https://pan.baidu.com/s/1trwZ8T2I2rFh59LVxTSXTw?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不易。知识付费甚欢…

开源DB-GPT实现连接数据库详细步骤

官方文档&#xff1a;欢迎来到DB-GPT中文文档 — DB-GPT &#x1f44f;&#x1f44f; 0.4.1 第一步&#xff1a;安装Minicoda https://docs.conda.io/en/latest/miniconda.html 第二步&#xff1a;安装Git Git - Downloading Package 第三步&#xff1a;安装embedding 模型到…

TFTP协议详解

1.简介 TFTP&#xff08;Trivial File Transfer Protocol,简单文件传输协议&#xff09;是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议&#xff0c;提供不复杂、开销不大的文件传输服务。端口号为69。 FTP是一个传输文件的简单协议&#xff0c;它基…

亚马逊怎么下单更真实

亚马逊是一个知名的在线购物平台&#xff0c;为了下单更真实&#xff0c;可以采取以下步骤&#xff1a; 1、查看商品信息&#xff1a;在浏览亚马逊的商品时&#xff0c;仔细查看商品描述、照片和客户评价。这些信息可以帮助你了解产品的真实情况。 2、对比价格&#xff1a;比…

Android Studio(项目打包成APK)

打包流程 直接上图即可 按照上面操作后&#xff0c;即可以开始打包&#xff0c;一般第一次打包都需要几分钟&#xff08;我第一次打包花了七八分钟&#xff09;&#xff0c;如果打包错误了也别担心&#xff0c;可以查看错误分析一下原因&#xff0c;实在不行可以把错误放到网站…

macos端串口调试推荐 serial直装激活 for mac

serial for mac版软件特色 1.准备好macOS High Sierra 最近的升级是否会让您的设备落后&#xff1f;Serial将使其恢复正常工作&#xff0c;同时保持Mac的安全功能完好无损。 2.完美无瑕的仿真 Serial是一个全功能的终端仿真器&#xff0c;支持Xterm&#xff0c;VT102和ANSI…

软件测试/测试开发丨PyCharm安装指南与技巧分享

点此获取更多相关资料 PyCharm 简介 工欲善其事&#xff0c;必先利其器。为了良好的学习体验&#xff0c;我们需要一款功能全面&#xff0c;并且容易上手的代码编辑器&#xff0c;那么首选大名鼎鼎的 PyCharm。 PyCharm 是一款功能强大的 Python 集成化开发工具&#xff0c;…

Linux系统CH347应用—GPIO输出输入与中断功能

Linux/安卓系统可使用CH347转接GPIO功能&#xff0c;所有GPIO均为双向IO口&#xff0c;支持输出与输入切换&#xff0c;输出时为推挽输出结构&#xff0c;具有较强驱动能力&#xff0c;输入时内部为弱上拉输入&#xff0c;上拉能力较弱。此外&#xff0c;用作输入的GPIO还支持G…

C# TCP Server服务端多线程监听RFID读卡器客户端上传的读卡数据

本示例使用设备介绍&#xff1a;液显WIFI无线网络HTTP协议RFID云读卡器可编程实时可控开关TTS语-淘宝网 (taobao.com) using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using Sy…

【Sql】sql server数据库提示:执行Transact-SQL语句或批处理时发生了异常。 无法打开数据库msdb,错误:926。

【问题描述】 打开sql server2008r2数据库的时候&#xff0c; 系统提示执行Transact-SQL语句或批处理时发生了异常。 无法打开数据库msdb&#xff0c;错误&#xff1a;926。 【概念理解】 首先MSDB数据库是的作用&#xff1a; 用于给SQL Server代理提供必要的信息来运行调度警…

89㎡现代风格,年轻人都向往的家!福州中宅装饰,福州装修

对于美好家的向往&#xff0c;是每位业主的需求。 大到每一个工艺&#xff0c;小到每一道装修程序&#xff0c;我们都以认真的态度&#xff0c;用专业的服务品质将家装的理念深入到每户业主的内心,赢得了上万千业主的支持和肯定。 怀着最初的一颗匠心,对于每一项工艺都认真钻研…

宽带服务预约小程序的内容

宽带有很高的需求度&#xff0c;无论是企业办公楼还是家庭场景&#xff0c;对网络的需求度都比较高&#xff0c;而宽带安装服务商也往往有不少生意&#xff0c;但在实际发展中也面对着一些痛点&#xff1a; 1、服务传播套餐展示难 宽带业务的需求度不低&#xff0c;但依然有很…

Redis注解式开发结合SSM项目使用与Quartz框架介绍以及击穿、穿透、雪崩问题解决

目录 一、SSM项目整合Redis 1.1 导入pom依赖 1.2 spring-redis.xml 1.3 spring上下文配置 二、Redis注解式开发 2.1 Cacheable 注解 2.2 自定义策略 2.3 CachePut 注解 三、Redis中缓冲、击穿、穿透、雪崩问题解决 3.1 缓冲问题 —— Quartz 框架 3.2 常见的三种问题…

备份扫描工具 god_bak

Part1 前言 不想写东西&#xff0c;或者说换种说法 有些东西还没写完&#xff0c;有些系列也还没整完。就放一个昨天摸鱼写的东西。 如图&#xff0c;每个系列都还是会按照自己的风格来写&#xff0c;代码审计实战等都会结合自己挖掘或审计过的案例进行结合知识点的风格去写&…

为什么一家价值 17 亿美元的政府承包商选择 Liquid UI 而不是 SAP Fiori 来开发和自动化 SAP 质量管理?

背景 L3 Technologies 是一家领先的航空航天和国防技术创新企业&#xff0c;致力于开发端到端解决方案&#xff0c;以满足客户的关键任务需求。L3 在全球 130 个国家/地区拥有 50,000 多名员工&#xff0c;年收入约为 170 亿美元&#xff0c;作为一家灵活的全球技术创新企业&a…

兰台内外杂志兰台内外杂志社兰台内外编辑部2023年第29期目录

数字档案创新研究 现阶段优抚医院档案建设信息化工作探讨 宋萍; 1-3 公立医院党务档案智慧型管理策略研究 陈丽; 4-6 信息化视阈下档案管理工作存在问题及改进措施研讨 石丽静; 7-9 试析数字化建设在医院档案现代化管理中的应用 赵迎红; 10-12《兰台内外》投稿…

拖拽组件推荐 grid-layout,可以做工作台

场景可以做工作台 文档&#xff1a;https://jbaysolutions.github.io/vue-grid-layout/zh/ 效果

香港优才计划人才清单51项2023全网最详细解释!

香港优才计划人才清单51项2023全网最详细解释&#xff01; 目前香港优才计划人才清单已经更新&#xff0c;由原有13项专业增至51项&#xff0c;以满足现阶段香港发展的需要&#xff0c;并即时应用于香港人才引进计划。 当前的人才清单涵盖9个行业的51项专业工种&#xff0c;包括…

禅道项目信息通知到钉钉群配置步骤

禅道是我们常用的项目进度管理工具&#xff0c;禅道集成了webhook功能&#xff0c;可以通过发送 JSON 格式的数据到第三方hook地址&#xff0c;进行消息集成&#xff0c;包括钉钉、企业微信以及飞书。可以考虑将禅道和钉钉两者可以结合起来&#xff0c;将项目信息发送到钉钉群&…

【空调】空调主控板实习记录

空调主控板实习笔记记录1 空调型号 空调kfr35gw什么意思 { 这个表示空调是3500W的&#xff0c;是1.5匹空调。 除了以上所说&#xff0c;空调主要机型的型号标识及其含义&#xff1a; KFR-25GW&#xff0c;简称25机型。KFR-35GW&#xff0c;简称35机型。KFR-50LW&#xff0c…