Linux--进程间的通信-匿名管道

进程间的通信

进程间通信(IPC,Interprocess Communication)是指在不同进程之间传输数据和交换信息的一种机制。它允许多个进程在同一操作系统中同时运行,并实现彼此之间的协作

进程间通信方式:

  1. 管道(Pipe)管道是最基本的进程间通信方式,它是一种半双工的通信方式,通过管道,可以实现两个不同进程之间的通信,使用时,只能一方写入,另一方读出。

  2. 消息队列(Message Queue):消息队列可以在没有任何关系的进程之间传递数据,它提供了一个消息的队列,发送方将消息放入队列,接收方从队列中获取消息。这种通信方式允许发送方和接收方独立于对方,不需要同步操作

  3. 共享内存(Shared Memory)共享内存是最快的进程间通信方式,它将一个特定的内存区域映射到多个进程的地址空间中,使得这些进程可以直接访问这块共享内存。共享内存通信方式适合于大量数据的高速交换

  4. 信号量(Semaphore):信号量是一种计数器,用于进程间的同步和互斥操作。它可以用来保护临界区资源,控制并发访问和协调进程间的操作顺序。

  5. 套接字(Socket):套接字是一种网络编程中常用的通信方式,它可以在不同主机之间进行进程间通信。套接字通信方式适用于分布式系统或者网络环境下的进程间通信。

  6. 管理器对象(Manager Object):这种通信方式利用一个专门的进程作为服务器,其他进程通过请求服务器来实现通信。管理器对象可以提供共享数据、远程过程调用等功能。

  7. 文件和数据库:进程可以通过读取和写入文件、数据库的方式进行通信。这种通信方式适用于持久化数据的交换和共享。

匿名管道

匿名管道,顾名思义也就是没有名字的管道,这种管道用于具有血缘关系的进程(父子进程等)之间进行通信。它是一种单向通信方式(半双工),即数据只能从一个进程流向另一个进程;

下面来了解匿名管道是如何创建的?
在这里插入图片描述

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

代码验证

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>void writer(int wfd)
{const char* str="hello father,i am child";char buffer[128];int cnt=0;pid_t pid=getpid();while(1){snprintf(buffer,sizeof(buffer),"message: %s, pid: %d,count:%d\n",str,pid,cnt);write(wfd,buffer,sizeof(buffer)-1);cnt++;sleep(1);}
}
void reader(int rfd)
{char buffer[1024];while(1){ssize_t n=read(rfd,buffer,sizeof(buffer)-1);printf("father get a message: %s",buffer);}
}
int main()
{int pipefd[2];int n=pipe(pipefd);if(n<0) return 1;printf("pipefd[0]:%d,pipefd[1]:%d\n",pipefd[0],pipefd[1]);pid_t id=fork();if(id==0){close(pipefd[0]);writer(pipefd[1]);exit(0);}close(pipefd[1]);reader(pipefd[0]);wait(NULL);return 0;
}

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

对匿名管道的具体分析

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

匿名管道的特点

  • 1.匿名管道只能用于具有情缘关系(父子进程)的进程间通信;
  • 2.自带同步机制
  • 3.管道只能单向通信,属于半双工通信类型;
  • 4.只要连接的进程有一方退出,那么管道自动释放,文件的生命周期是伴随着进程的;

PIPE_BUF

PIPE_BUF是一个宏定义,在Linux系统中,它表示管道(pipe)的缓冲区大小(一般为4096字节)。具体来说,PIPE_BUF定义了一个原子写入管道的最大字节数。

根据POSIX标准规定,当要写入的数据长度小于等于PIPE_BUF时,操作系统会保证写入的原子性。也就是说,对于不超过PIPE_BUF字节的写操作,写入的数据会作为一个连续序列写入管道,而不会被其他进程的写操作所中断

然而,当要写入的数据长度超过PIPE_BUF时,操作系统并不保证写入的原子性。这意味着,写入的数据可能会被其他进程的写操作所中断,从而导致数据交叉写入到管道中

需要注意的是,PIPE_BUF的值可以在不同的系统上有所不同。在大多数系统中,PIPE_BUF的值通常为4096字节(4KB),但也可以更大或更小。你可以通过在代码中包含头文件limits.h并查看其中的定义来获取当前系统上的PIPE_BUF值。

所以,在使用管道进行进程间通信的时候,如果希望保证数据的完整性,应确保每次写入的数据不超过PIPE_BUF字节。如果要写入的数据量超过了PIPE_BUF,可以考虑分多次写入或使用其他方式来保证数据的完整性

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

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

相关文章

静态页面上传服务器无法显示css效果

今天做比赛的项目&#xff0c;把静态页面上传到服务器&#xff0c;发现外联的css文件的效果无法显示&#xff0c;一开始以为是路径问题&#xff0c;后面改了发现没有改变。 然后发现在浏览器上css文件中content-type: text/plain的问题 这才是正确的&#xff1a; 修改办法&…

【QT】pro文件里添加又删除LIBS不影响运行的原因

我发现个问题啊&#xff0c;如果运行项目&#xff0c;发现报错&#xff0c;缺少某dll&#xff0c;接着你在pro文件里加上win32:LIBS -lOpengl32&#xff08;举个例子&#xff09;&#xff0c;接着可以运行了&#xff0c;接着把这行删掉&#xff0c;再运行&#xff0c;仍然可以…

PCB学习记录---原理图

一、注释 NC&#xff1a;no connect,默认不连接 NF: no fix&#xff0c;默认不安装 0R: 0R的电阻&#xff0c;即可以短路 二、看图流程 1、看标题&#xff0c;了解功能 2、浏览有几个模块 3、找芯片对应的数据手册&#xff0c;了解芯片功能和使用 例如CH224&#xff…

JavaScript - 你知道==、===和Object.is的区别吗

难度级别:初级及以上 提问概率:75% 因为==操作符会存在数据类型的隐式转换,所以最终判断的是转换后的值是否相等,经过总结发现,除了null、undefined和NaN以外,其他的数据类型在遇到==数据转换时候,更倾向于先转为数值类型再进行比较,…

agi入门-大模型开发基础

AGI(Artifical General Inteligence)的到来还有多久&#xff1f; 乐观预测&#xff1a;明年主流预测&#xff1a;3-5年悲观预测&#xff1a;10年 AGI时代&#xff0c;AI无处不在&#xff0c;相关从来者将如何分&#xff1f; AI使用者&#xff1a;使用别人开发的AI产品AI产品…

LangChain学习——核心组件

LangChain是一个用于大语言模型&#xff08;LLM&#xff09;应用开发的框架&#xff0c;它简化了LLM应用的开发难度&#xff0c;帮助开发者快速构建复杂的LLM应用。 一、LangChain 库简介​ LangChain 包的主要价值主张是&#xff1a; 组件&#xff1a;用于处理语言模型的可…

面试经典算法系列之双指针6 -- 三数之和

面试经典算法题6 – 三数之和 LeetCode.15 公众号&#xff1a;阿Q技术站 问题描述 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有…

密码学与密码安全:理论与实践

title: 密码学与密码安全&#xff1a;理论与实践 date: 2024/4/10 21:22:31 updated: 2024/4/10 21:22:31 tags: 密码学加密算法安全协议密码分析密码安全实际应用未来发展 第一章&#xff1a;密码学基础 1.1 密码学概述 密码学是研究如何保护信息安全的学科&#xff0c;旨在…

OSPF数据报文格式

OSPF协议是跨层封装的协议&#xff0c;跨四层封装&#xff0c;直接将应用层的数据封装在网络层协议后面&#xff0c;IP协议包中协议号字段对应的数值为——89 OSPF的头部信息&#xff1a; ——所有数据包公有的信息 版本&#xff1a;OSPF版本 在IPV4中一般使用OSPFV2&#xf…

配置启动nacos,保姆级教程

下载nacos 下载链接 https://github.com/alibaba/nacos/releases进去下拉&#xff0c;找到下载版本信息。 下载后如图所示。 配置数据库 在我们的conf文件夹中有一个nacos-mysql的数据库文件 我们需要导入数据库&#xff0c;可通过工具Navicat等进行导入。 会有一下几张表…

计算机进制

进制 进制也就是进位制&#xff0c;是人们规定的一种进位方法对于任何一种进制—X进制&#xff0c;就表示某一位置上的数运算时是逢X进一位 十进制是逢十进一&#xff0c;十六进制是逢十六进一&#xff0c;二进制就是逢二进一&#xff0c;以此类推&#xff0c;x进制就是逢x进…

WebGPU vs. 像素流

在构建 Bzar 之前&#xff0c;我们讨论过我们的技术栈是基于在云上渲染内容的像素流&#xff0c;还是基于使用设备自身计算能力的本地渲染技术。 由于这种选择会极大地影响项目的成本、可扩展性和用户体验&#xff0c;因此在开始编写一行代码之前&#xff0c;从一开始就采取正确…

在B站看课的进度助手

效果 代码 BilibiliVideoDurationCrawler import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import java.io.IOException; import java.text.ParseException; import java.util.ArrayList; imp…

KVM+GFS分布式存储系统构建KVM高可用

概述 本章利用KVM 及 GlusterFS 技术&#xff0c;结合起来从而实现 KVM 高可用。利用 GlusterFS 分布式复制卷&#xff0c;对 KVM 虚拟机文件进行分布存储和冗余。分布式复制卷主要用于需要冗余的情况下把一个文件存放在两个或两个以上的节点&#xff0c;当其中一个节点数据丢失…

雪花飘,购物抛物线,进度条等四个案列,带入走进 CSS transition

前言 今天从四个案例&#xff0c;我们一起走进 CSS Transition。 源码 以及 在线演示地址 源码地址&#xff1a; 四个案例&#xff0c; CSS Transition 源码 在线演示地址&#xff1a;(兼容移动端) 贝塞尔曲线运动进度条雪花飘飘效果购物车抛物线效果 案例演示 内置贝塞…

windows server 2019 -DNS服务器搭建

前面是有关DNS的相关理论知识&#xff0c;懂了的可以直接跳到第五点。 说明一下&#xff1a;作为服务器ip最好固定下来&#xff0c;以DNS服务器为例子&#xff0c;如果客户机的填写DNS信息的之后&#xff0c;服务器的ip如果变动了的话&#xff0c;客户机都得跟着改&#xff0c…

深入浅出Redis(九):Redis的发布订阅模式

引言 Redis是一款基于内存的键值对数据库&#xff0c;提供了多种数据结构存储数据&#xff0c;存取数据的速度还非常快&#xff0c;除了这些优点它还提供了其他特色功能&#xff0c;比如&#xff1a;管道、lua脚本、发布订阅模型 本篇文章主要描述发布订阅模型&#xff0c;将…

linux基础篇:Linux中磁盘的管理(分区、格式化、挂载)

Linux中磁盘的管理&#xff08;分区、格式化、挂载&#xff09; 一、认识磁盘 1.1 什么是磁盘 磁盘是一种计算机的外部存储器设备&#xff0c;由一个或多个覆盖有磁性材料的铝制或玻璃制的碟片组成&#xff0c;用来存储用户的信息&#xff0c;这种信息可以反复地被读取和改写…

Leetcode算法训练日记 | day22

一、二叉搜索树的最近公共祖先 1.题目 Leetcode&#xff1a;第 235 题 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个结点 p、q&#xff0c;最近公共祖先表示为一个结点 x&#xff0c;满足…

Python 发送邮件 (含代码)

通过Python代码来发送邮件。下面是步骤 先在某一个邮箱页面 开启 POP3/SMTP服务 获取授权码&#xff0c;这样免密码登录 授权码会用在代码里 获得 SMTP 服务器地址 代码 import smtplib from email.mime.text import MIMEText from email.utils import formataddr ms…