Linux 进程的管道通信

文章目录

    • 无名管道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]$ 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

java学习part01

15-Java语言概述-单行注释和多行注释的使用_哔哩哔哩_bilibili 1.命令行 javac编译出class文件 然后java运行 2. java文件每个文件最多一个public类 3.java注释 单行注释 // 多行注释 文档注释 文档注释内容可以被JDK提供的工具javadoc所解析&#xff0c;生成一套以网页文…

赛氪ETTBL全国商务英语翻译大赛入榜国内翻译赛事发展评估报告

中国外文局下属CATTI项目管理中心出具2023 国内翻译赛事发展评估报告&#xff0c;ETTBL全国商务英语翻译大赛赫然在榜 2023年11月6日&#xff0c;继2022年首次发布国内翻译赛事发展评估报告后&#xff0c;中国外文局CATTI项目管理中心和中国外文界平台联合发布了《2023国内翻译…

JVM字符串常量池StringTable

目录 一、StringTable为什么要调整 二、String的基本特性 三、String的内存分配 四、字符串拼接操作 五、intern()方法 六、Stringtable的垃圾回收 七、G1中String去重操作 一、StringTable为什么要调整 jdk7之前&#xff0c;hotspot对于方法区的实现是永久代&#xff…

基于若依的ruoyi-nbcio流程管理系统仿钉钉流程json转bpmn的flowable的xml格式(排它条件网关)

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 这个章节来完成并行网关与排它条件网关的功能 1、前端 目前就修改了排它条件网关的前端条件部分&#xf…

嵌入式养成计划-52----ARM--开发板介绍--相关硬件基础内容介绍--GPIO讲解

一百三十一、开发板介绍 131.1 核心板介绍 131.2 拓展板 一百三十二、相关硬件基础内容介绍 132.1 PCB PCB&#xff08; Printed Circuit Board&#xff09;&#xff0c;中文名称为印制电路板&#xff0c;又称印刷线路板&#xff0c; 是重要的电子部件&#xff0c;是电子元器…

springboot全局拦截sql异常

起因:非法用户可通过特定的输入(如输入内容超长)等操作,使后台逻辑发生错误,从而使后台sql语句暴露至前台,进而为sql攻击提供条件 处理流程:经查找com.mysql.cj.jdbc.exceptions的父类为SQLException,在全局异常处理类中增加如下配置,经测试不起作用 ExceptionHandler(SQLExce…

款网络拓扑自动扫描工具

Topology-Scanner是WeOps团队免费开放的一个网络拓扑自动扫描模块&#xff0c;可以自动发现网络设备的类型、网络设备之间的互联 使用方式 java -jar ./topology-scanner.jar --config_path./config/ 配置说明 1. 拓扑发现请求参数文件(request.json) ips [全网发现] 模式时…

asp.net core weapi 结合identity完成登录/注册/角色/权限分配

1.安装所需要的nuget包 <PackageReference Include"Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version"6.0.24" /><PackageReference Include"Microsoft.EntityFrameworkCore" Version"6.0.24" /><PackageR…

Git应用(1)

一、Git Git(读音为/gɪt/。中文 饭桶 )是一个开源的分布式版本控制系统&#xff0c;可以有效、高速地处理从很小到非常大的项目版本管理。 了解更多可到GIT官网&#xff1a;Git - Downloads GIT一般工作流程如下&#xff1a; 1&#xff0e;从远程仓库中克隆 Git 资源作为本地…

线程安全问题解析

线程内存模型 线程在工作的时候&#xff0c;如果涉及到需要访问对象的某个成员变量&#xff0c;比如下面的这个类里的amount 属性&#xff1a; class Goods {private int amount;// balabala.....} 线程在运行期间&#xff0c;首先把这个属性从主内存里load进自己的工作内存&…

leetcode:160. 相交链表

一、题目 原题链接&#xff1a;160. 相交链表 - 力扣&#xff08;LeetCode&#xff09; 函数原型&#xff1a; struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) 二、思路 判断两个链表是否相交&#xff0c;只要判断两个链表是否有相同的…

图数据库Neo4j详解

文章目录 第一章 图和Neo4j1.1 图数据库概念1.1.1 图论起源1.1.2 节点-关系及图1.1.3 图数据库1.1.4 图数据库分类1.1.4 图数据库应用场景1.1.5 与关系型数据库对比1.1.6 图数据库优势 1.2 Neo4j介绍1.2.1 Neo4j是什么1.2.2 Neo4j特点1.2.3 Neo4j的优势1.2.4 Neo4j的限制1.2.5 …

揭秘系列: Goroutine调度器

现在不要担心理解上面的图片&#xff0c;因为我们将从非常基础的知识开始。 Goroutines分布在线程中&#xff0c;由Goroutine调度器在幕后处理。根据我们之前的讨论&#xff0c;我们知道一些关于Goroutines的事情&#xff1a; •从原始执行速度来看&#xff0c;Goroutines不一定…

Unity中全局光照GI的总结

文章目录 前言一、在编写Shader时&#xff0c;有一些隐蔽的Bug不会直接报错&#xff0c;我们需要编译一下让它显示出来&#xff0c;方便修改我们选择我们的Shader&#xff0c;点击编译并且展示编译后的Shader后的内容&#xff0c;隐蔽的Bug就会暴露出来了。 二、我们大概回顾一…

智慧畜牧小程序开发流程

本文将详细介绍智慧畜牧小程序的开发流程&#xff0c;包括需求分析、设计、开发、测试和上线等环节。同时&#xff0c;将深入思考智慧畜牧小程序的发展趋势和未来挑战&#xff0c;为读者提供有深度的思考和逻辑性的分析。 一、需求分析 1.明确目标用户&#xff1a;首先…

Bond配置文件配置

1、选择2个自己需要的网口&#xff0c;查看有哪些网口 [roothostname ~]# ifconfig -a [roothostname ~]#systemctl disable NetworkManager 开机不启动图形化网络服务 2、编辑网口的配置文件 [roothostname ~]# cd /etc/sysconfig/network-scripts [roothostname n…

实操创建属于自己的亚马逊云科技VPS服务:Amazon Lightsail

本文主要讲述如何独立创建自己的亚马逊云科技VPS服务&#xff0c;希望此文能帮助你对亚马逊云科技VPS服务也就是Amazon Lightsail&#xff0c;有个新的认识&#xff0c;对所使用的VPS有所帮助。 Amazon Lightsail是一款无论云计算的新手还是专家&#xff0c;都可通过其快速启动…

Sagemaker基础操作指南

简介 Amazon SageMaker是亚马逊AWS提供的一项托管式机器学习服务&#xff0c;旨在简化和加速机器学习开发的整个生命周期。它为机器学习工程师和数据科学家提供了一套完整的工具和功能&#xff0c;用于构建、训练、调优和部署机器学习模型。本文将会通过一个简单的例子&#x…

Conda executable is not found 三种问题解决

如果在PyCharm中配置Python解释器时显示“conda executable is not found”错误消息&#xff0c;这意味着PyCharm无法找到您的Conda可执行文件。您可以按照以下步骤解决此问题&#xff1a; 1.方法一 确认Conda已正确安装。请确保您已经正确安装了Anaconda或Miniconda&#xff…

演示文稿制作软件 Deckset mac中文版介绍

Deckset mac是一款Mac上的演示文稿制作软件&#xff0c;它可以让你使用Markdown语言快速地创建演示文稿。与传统的演示文稿制作软件相比&#xff0c;Deckset采用了全新的设计理念&#xff0c;旨在让用户更加专注于内容的创作&#xff0c;而不是花费过多的时间在排版和设计上。 …