12.1 Linux_进程间通信_管道

news2024/11/27 12:35:45

概述

什么是无名管道:

无名管道就是在内核中开辟了一块内存,进程1和进程2都可以访问这一块空间,从而实现通信。

当无名管道被创建时,父进程fd[0]指向管道的读端,fd[1]指向管道的写端。fork创建子进程后,子进程也有一对fd[0]指向管道的读端,fd[1]指向管道的写端。具体结构如下:

之后可以使一个进程关闭读端,另一个进程关闭写端。关闭后的具体结构如下: 

无名管道(pipe)的特点:

  • 只能用作父子进程、兄弟进程之间的通信。
  • 单工通信,具有固定的读端和写端。即:只能一段读一段写,如果想读写都可以,则需要两条管道。
  • 创建无名管道时会返回2个文件描述符,分别用于读写管道

有名管道(fifo)的特点:

  • 解决了无名管道只能用作父子进程、兄弟进程之间的通信的问题
  • 有名管道通过路径名操作(管道文件p),在文件系统中可见,但内容存放在内存中。
  • 遵循先进先出规则。
  • 不支持lseek操作光标位置。
  • 单工通信。

无名管道

1、创建

int pipe(int pipefd[2]);

返回值:成功返回0,失败返回EOF

pipefd:返回的文件描述符,pipefd[0]用于读,pipefd[1]用于写

注意:对于一个进程,只能使用一个文件描述符。即:该进程要么读管道,要么写管道,不能同时读写。

2、读写

读写管道就是使用文件I/O,像普通文件一样进行读写。

读管道特性:

  • 管道中有数据,read返回实际读取到的字节数
  • 管道中无数据,且写端全部关闭,read返回0
  • 管道中无数据,但写端没有关闭,read阻塞等待

写管道特性:

  • 写管道时,读端全部关闭,进程异常终止,信号为SIGPIPE(管道破裂)。
  • 写管道时,如果管道已满,write阻塞等待。管道大小为64K
  • 写管道时,如果管道未满,write返回实际写入的字节数

实验代码 

无名管道实验代码如下:

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

int main(){
	int pfd[2];
	pid_t pid;
	char buf[100] = {0};
	//创建无名管道
	if(pipe(pfd)<0){
		perror("pipe");
		return -1;
	}
	pid = fork();
	if(pid<0){
		perror("fork");
		return -1;
	}else if(pid == 0){
		while(1){
			write(pfd[1],"pipe test",strlen("pipe test"));//写管道
			close(pfd[0]);//关闭读
            sleep(1);
		}
	}else{
		while(1){
			read(pfd[0],buf,sizeof(buf));//读管道
            close(pfd[1]);//关闭写
			printf("read:%s\n",buf);
		}
	}
	return 0;
}

有名管道

1、创建

int mkfifo(const char *pathname, mode_t mode);

返回值:成功返回0,失败返回EOF 

pathname:文件路径,不要新建在共享目录下。

mode:文件权限,实际权限 = mode & (~umask) 

2、打开

打开管道文件就是使用使用文件I/O的open函数。

注意:open的flag参数只能传入O_RDONLY或O_WRONLY,因为管道只能一端读或一端写。

注意:当open的flag没有加上O_NONBLOCK时,open进入阻塞状态,直到有另一个进程以对应的只读或只写打开。即:进程A只读打开时阻塞,直到进程B只写打开;或者进程A只写打开时阻塞,直到进程B只读打开。

3、读写

读写管道就是使用文件I/O,像普通文件一样进行读写。

写入数据完整性问题:

在多进程写入管道时,当写入数据的大小 <= PIPE_BUF(4K)时,系统会自动保证数据的完整性,即要么全部写入,要么一个不写。当写入数据 > 4K时,不能自动保证数据完整性。

实验代码

writefifo.c代码如下:

#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>

#define FIFO_PATH "./fifo"
int main(){
	
	int fd;
	//创建有名管道
	if(mkfifo(FIFO_PATH,0777)<0){
		perror("mkfifo");
	}
	//打开管道文件
	if((fd = open(FIFO_PATH,O_WRONLY)) < 0){//以只读方式打开
		perror("open");
	}
	//写管道
	while(1){
		write(fd,"write fifo",strlen("write fifo"));
		printf("has write\n");
		sleep(1);
	}
	//关闭文件
	close(fd);

	return 0;
}

readfifo.c代码如下:

#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>

#define FIFO_PATH "./fifo"
int main(){
	
	int fd;
	char buf[100];
	//打开管道文件
	if((fd = open(FIFO_PATH,O_RDONLY)) < 0){//以只写方式打开
		perror("open");
	}
	//读管道
	while(1){
        //有数据才操作,防止写端关闭read不进行阻塞导致刷屏
		if(read(fd,buf,sizeof(buf)-1)>0){
			printf("read:%s\n",buf);
			memset(buf,0,sizeof(buf));
		}
	}
	//关闭文件
	close(fd);

	return 0;
}

代码运行结果如下:

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

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

相关文章

4.人员管理模块(开始预备工作)——帝可得管理系统

目录 前言一、需求分析1.页面原型2.创建SQL 二、使用若依框架生成前后端代码1.添加目录菜单2.添加数据字典3.配置代码生成信息4.下载代码并导入项目5.快速导入方法 三、 总结 前言 提示&#xff1a;本篇讲解人员管理模块的开发的预备工作&#xff0c;包括需求分析、生成代码、…

点亮一个LED以及按键控制

目录 前言 LED 1.LED介绍 2.LED原理图 3.如何实现发光 按键 1.按键原理图 2.按键原理 按键控制LED 1.代码实现 2.软件消除抖动 软件消除抖动的原因 软件消抖如何实现 总结 前言 我们上节完成了开发环境的安装&#xff0c;本节我们就来实现我们的第一个程序吧(没安…

STM32的集成电路总线I2C

一、I2C简介 1.I2C总线特点 &#xff08;1&#xff09;两线制 I2C只需要SDA、SCL两根线来完成数据的传输和外围器件的扩展&#xff0c;器件地址采用软件寻址方式。 &#xff08;2&#xff09;多主机总线 I2C是一个真正的多主机总线&#xff0c;如果2个或多个主机同时初始化数据…

Day01-MySQL数据库介绍及部署

Day01-MySQL数据库介绍及部署 1、数据库服务概述介绍1.1 企业中为什么需要数据库&#xff1f;1.2 数据库服务作用1.3 数据库服务分类 2、数据库服务安装部署2.1 数据库版本应用2.2 数据库服务程序下载2.3 数据库软件安装方式2.3.1 二进制安装步骤 3、数据库服务初始化介绍3.1 安…

《15分钟轻松学 Python》教程目录

为什么要写这个教程呢&#xff0c;主要是因为即使是AI技术突起的时代&#xff0c;想要用好AI做开发&#xff0c;那肯定离不开Python&#xff0c;就算最轻量级的智能体都有代码块要写&#xff0c;所以不一定要掌握完完整整的Python&#xff0c;只要掌握基础就能应对大部分场景。…

react-问卷星项目(6)

实战 React常用UI组件库 Ant Design国内最常用组件库&#xff0c;稳定&#xff0c;强大Material UI国外流行TailWind UI 国外流行&#xff0c;收费 Ant Design 官网地址 这一章基本内容就是使用UI重构页面&#xff0c;也没有什么知识点&#xff0c;直接上代码 下载 npm ins…

git diff 查看到一行变动,但是目测无差异怎么办?

1. 目测无变化 直接用 git diff main.js 提示有一行变动&#xff0c;但是目测看不出来差异。 结果如图&#xff1a;up panel. 2. 大概是空格的问题&#xff0c;使用参数 --ws-error-highlightall $ git diff --ws-error-highlightall main.js结果如图: down panel.

【LeetCode: 19. 删除链表的倒数第 N 个结点 | 链表 + 快慢指针】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

大学生就业桥梁:基于Spring Boot的招聘系统

1系统概述 1.1 研究背景 如今互联网高速发展&#xff0c;网络遍布全球&#xff0c;通过互联网发布的消息能快而方便的传播到世界每个角落&#xff0c;并且互联网上能传播的信息也很广&#xff0c;比如文字、图片、声音、视频等。从而&#xff0c;这种种好处使得互联网成了信息传…

【操作系统】引导(Boot)电脑的奇妙开机过程

&#x1f339;&#x1f60a;&#x1f339;博客主页&#xff1a;【Hello_shuoCSDN博客】 ✨操作系统详见 【操作系统专项】 ✨C语言知识详见&#xff1a;【C语言专项】 目录 什么是操作系统的引导&#xff1f; 操作系统的引导&#xff08;开机过程&#xff09; Windows操作系…

JavaScript-下篇

上篇我们学习了&#xff0c;一些基础语法和函数&#xff0c;现在我们学习下篇&#xff0c;主要包括,对象和事件。而对象又包括&#xff0c;数组Arrays&#xff0c;String字符串&#xff0c;BOM&#xff0c;DOM等 JS对象 Arrays数组 数组是一种特殊的对象&#xff0c;用于存储…

【多线程】多线程(8):单例模式:阻塞队列

【阻塞队列】 阻塞队列是在普通的“先进先出”队列的基础上&#xff0c;做出了扩充&#xff0c;可以组成「生产者消费者模型」 1.线程安全性 标准库是原有的队列Queue和其子类&#xff0c;默认都是“线程不安全的”&#xff0c;而阻塞队列是“线程安全的” 2.具有阻塞特性 …

【pytorch】张量求导3

再接上文,补一下作者未补完的矩阵运算的坑。 首先贴一下原作者的图,将其转化为如下代码: import torch import torch.nn as nn import torch.optim as optim# 定义一个简单的两层神经网络 class TwoLayerNet(nn.Module):def __init__(self):super(TwoLayerNet, self).__in…

Markdown 语法详解大全(超级版)(二)

Markdown 语法详解大全(超级版)&#xff08;二&#xff09; Markdown 语法详解大全(超级版)&#xff08;一&#xff09; Markdown 语法详解大全(超级版)&#xff08;二&#xff09; Markdown 语法详解大全(超级版)&#xff08;三&#xff09; &#xff08;歌词节选&#xff09…

Ubuntu 中 Redis ,MySQL 基本使用

1、Redis &#xff08;1&#xff09;启动Redis 服务端客户端命令 服务端 ps aux | grep redis 查看redis服务器进程 sudo kill -9 pid 杀死redis服务器 sudo redis-server /etc/redis/redis.conf 指定加载的配置文件客户端 连接redis&#xff1a; redis-cli运⾏测试命令&am…

C++结构体定义和创建

// // Created by 徐昌真 on 2024/10/5. // #include <iostream> using namespace std;int main() {//结构体的定义 struct 结构体名字 { 结构体成员名字 }struct Book{string name;double price;int value;}java; //java是创建的结构体//创建结构体//这是第一种方式Boo…

目标检测 DAB-DETR(2022)

文章目录 前言Query是什么&#xff0c;Detr收敛速度慢的原因是什么&#xff1f;改进策略位置先验和模型框架设置温度系数 前言 本文认为原始的Detr系列论文中&#xff1a;可学习的object queries仅仅是给model预测box提供了锚点&#xff08;中心点&#xff09;信息&#xff0c…

SpringBoot环境下古典舞交流平台的快速开发

第三章 系统分析 3.1 可行性分析 需要使用大部分精力开发的古典舞在线交流平台为了充分降低开发风险&#xff0c;特意在开发之前进行可行性分析这个验证系统开发是否可行的步骤。本文就会从技术角度&#xff0c;经济角度&#xff0c;还有操作角度等进行综合阐述。 3.1.1技术可行…

Python案例--三数排序

一、引言 在信息爆炸的时代&#xff0c;我们每天都会接触到大量的数据。无论是工作中的报表、学习中的数据集&#xff0c;还是日常生活中的购物清单&#xff0c;数据的有序性对于提高效率和决策质量都至关重要。排序算法作为数据处理的基础工具&#xff0c;其重要性不言而喻。…

日记学习小迪安全27

感觉复制粘贴没有意思&#xff0c;而且还有点浪费时间&#xff0c;主要是学习&#xff0c;不是复制&#xff0c;那就复制别人的吧 第27关就参考这篇文章吧&#xff0c;以下大部分内容都是参考以下文章&#xff08;侵权删除&#xff09; 第27天&#xff1a;WEB攻防-通用漏洞&a…