linux进程间通信之管道通信

        Linux 进程间通信机制分三类:数据交互,同步,信号。理解了这些机制才能灵活运用操作系统提供的 IPC 工具。

一.管道

        管道是一种文件形式,是内核的一块缓冲区。匿名管道只能用于具有亲缘关系的进程间通信,命名管道可以用于任意的进程间通信。管道自带同步与互斥功能(读写操作数据大小不超过PIPE_BUF大小,读写操作受保护)。无名管道是一种内存文件,只能用于具有亲缘关系的进程间通信,fork的方式。管道是半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。虽然管道是半双工的,但是我们可以通过创建两个无名管道实现父子进程间的相互通信。

(1)无名管道

        
        有如下两个特点:
        1. 只能用于有关联的进程间数据交互,如父子进程,兄弟进程,子孙进程,在目录中看不到文件节点,读写文件描述符存在一个 int 型数组中。
        2. 只能单向传输数据,即管道创建好后,一个进程只能进行读操作,另一个进程只能进行写操作,读出来字节顺序和写入的顺序一样。

无名管道使用步骤:
        1. 调用 pipe() 创建无名管道;
        2. fork()创建子进程,一个进程读,使用 read() ,一个进程写,使用 write()

1.pipe()函数

2.代码

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <sys/stat.h>
int main(void)
{char buf[32] = {0};pid_t pid;// 定义一个变量来保存文件描述符// 因为一个读端,一个写端,所以数量为 2 个int fd[2];// 创建无名管道pipe(fd);printf("fd[0] is %d\n", fd[0]);printf("fd[2] is %d\n", fd[1]);// 创建进程pid = fork();if (pid < 0){printf("error\n");}if (pid > 0){int status;close(fd[0]);write(fd[1], "hello", 5);close(fd[1]);wait(&status);exit(0);}if (pid == 0){close(fd[1]);read(fd[0], buf, 32);printf("buf is %s\n", buf);close(fd[0]);exit(0);}return 0;
}

3.结果

(2)有名管道

        有名管道 中可以很好地解决在无关进程间数据交换的要求,并且由于它们是存在于文件系统中的,这也提供了一种比匿名管道更持久稳定的通信办法。 有名管道在一些专业书籍中叫做命名管道,它的特点是
        1.可以使无关联的进程通过 fifo 文件描述符进行数据传递;
        2.单向传输有一个写入端和一个读出端,操作方式和无名管道相同。

1.mkfifo()函数

2.使用步骤

        1. 使用 mkfifo() 创建 fifo 文件描述符。
        2. 打开管道文件描述符。
        3. 通过读写文件描述符进行单向数据传输。

3.实验代码

        创建两个无关联的进程,一个进程创建有名管道并写数据,另一个进程通过管道读数据。
fifo_write.c。
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(int argc, char *argv[])
{int ret;char buf[32] = {0};int fd;if (argc < 2){printf("Usage:%s <fifo name> \n", argv[0]);return -1;}if (access(argv[1], F_OK) == 1){ret = mkfifo(argv[1], 0666);if (ret == -1){printf("mkfifo is error \n");return -2;}printf("mkfifo is ok \n");}
fd = open(argv[1], O_WRONLY);
while (1)
{sleep(1);write(fd, "hello", 5);
}close(fd);return 0;
}
fifo_read.c
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
int main(int argc, char *argv[])
{char buf[32] = {0};int fd;if (argc < 2){printf("Usage:%s <fifo name> \n", argv[0]);return -1;}fd = open(argv[1], O_RDONLY);while (1){sleep(1);read(fd, buf, 32);printf("buf is %s\n", buf);memset(buf, 0, sizeof(buf));}close(fd);return 0;
}

4.结果

二.共享内存

        共享内存是最快的通信方式。共享内存允许多个进程访问同一块物理内存空间,以实现快速的数据共享和通信。但是,共享内存需要解决诸如数据同步和互斥等问题。

三.消息队列

        消息队列是一种灵活的进程间通信方式。它允许多个进程通过发送和接收消息来进行通信。消息队列可以在不同的进程间传递数据,并且可以解决进程间的同步和互斥问题。

四.信号量

        信号量是一种用于控制多个进程对共享资源的访问数量的工具。它通常用于解决并发访问共享资源的问题。

五.信号

        信号是一种异步的通信方式,用于通知另一个进程某个事件已经发生或者请求终止进程等操作。

六.套接字

        套接字是一种更为通用的进程间通信方式。它可以通过网络在不同的计算机之间进行通信,也可以在本地进程间进行通信。套接字可以用于实现多种类型的通信需求,包括数据传输、命名管道、共享内存等。

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

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

相关文章

在Linux上安装Oracle 数据库 11g (含静默方式安装)

好久没碰11g了&#xff0c;今天&#xff08;2023年11月16日&#xff09;因为有个需求又装了一遍。 在OCI上安装了一个Oracle Linux 6实例&#xff1a; $ uname -a Linux instance-20231116-1239-db11g 4.1.12-124.80.1.el6uek.x86_64 #2 SMP Mon Oct 9 02:32:10 PDT 2023 x86…

多维度梳理 MySQL 锁

多维度梳理 MySQL 锁 1、并发问题的解决方案2、MySQL的各类型锁2.1、从数据操作的类型划分 (读锁、写锁)2.2、从数据操作的粒度划分2.2.1、表锁2.2.1.1、表级别的S 锁、X 锁2.2.1.2、意向锁&#xff08;IS、IX&#xff09;2.2.1.3、自增锁2.2.1.4、元数据锁 2.2.2、行锁2.2.2.1…

华为eNSP综合实验考试

VLAN信息表 设备名称 端口 链路类型 VLAN 参数 HZ-HZCampus-Agg01-S5731 GE0/0/1 Trunk PVID:1 Allow-pass&#xff1a;10 20 Eth-trunk1&#xff08;GE0/0/2,0/0/3,0/0/23&#xff09; Trunk PVID:1 Allow-pass&#xff1a;10 20 GE0/0/24 Access PVID&#xf…

AttributeError: module ‘gradio‘ has no attribute ‘ClearButton‘解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

(1)(1.16) Maxbotix I2C声纳

文章目录 前言 1 连接到Pixhawk 2 通过Mission Planner进行设置 3 测试传感器 4 参数说明 前言 Maxbotix I2C EZ4 声纳&#xff08;又称 I2CXL-MaxSonar-EZ4 或 MB1242&#xff09;是一种相对便宜的短距离&#xff08;最多 7m&#xff09;测距仪&#xff0c;主要设计用于…

小迈迈驰组态软件支持国产龙芯2K1000等处理器

自2019年起&#xff0c;南京迈思德电气自动化有限公司组织研发团队&#xff0c;进行跨平台组态软件的研发&#xff0c;适配国产处理器&#xff0c;目前已经完成单机版产品的研发&#xff0c;并在基于龙芯2K1000处理器[Loongnix操作系统]的加固人机界面产品上应用。 Loongnix是龙…

2023年中国机动车拍卖网络化趋势加速,网络拍卖专场数量大幅上升至47489场[图]

2022年&#xff0c;由于机动车拍卖网络化趋势继续加速&#xff0c;网络拍卖专场数量大幅上升&#xff0c;全国机动车专场拍卖会高达59450场&#xff0c;较上年攀升125.31%。在389家拍卖企业中&#xff0c;举办场次超过100场的企业有27家&#xff0c;合计54850场&#xff0c;占比…

【观察】OpenHarmony:技术先进“创新局”,持续创新“谋新篇”

毫无疑问&#xff0c;开源作为今天整个软件产业的创新“原动力”&#xff0c;目前在软件产业发展中的重要性愈加凸显。根据Linux基金会的统计&#xff0c;现在全球软件产业中有70%以上的代码来源于开源软件。 从这个角度来看&#xff0c;开源技术已逐渐成为推动企业数字化转型和…

全球地表水数据集JRC Global Surface Water Mapping Layers, v1.2数据

简介&#xff1a; 全球地表水覆盖&#xff08;Global Surface Water&#xff09;是利用1984至2019年获取的landsat5、landsat7和landsat8的卫星影像&#xff0c;生成分辨率为30米的一套全球地表水覆盖的地图集。用户可以在全球尺度上按地区回溯某个时间上地表水分的变化情况。…

数据防泄密系统,企业数据防泄密软件

数据防泄密系统&#xff0c;企业数据防泄密软件 数据防泄密系统是一种企业数据防泄密软件&#xff0c;旨在保护企业核心信息资产&#xff0c;防止数据泄露。对电脑中的电子文档进行实时动态保护&#xff0c;全程跟踪操作&#xff0c;并对各种可能造成泄密的途径进行控制&#…

java“贪吃蛇”小游戏

基于java实现贪吃蛇小游戏&#xff0c;主要通过绘制不同的图片并以一定速度一帧一帧地在窗体上进行展示。 我是在javaSwing项目下创建了一个包 名字叫做&#xff1a;Snakes包 包下有一个启动类和一个设置代码的主界面两个类 代码主界面&#xff1a; 代码主界面主要讲解的是 …

主办方:上海视频媒体,多样式多渠道跨屏传播

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 一&#xff0c;邀请视频媒体参加活动发布会&#xff0c;好处多多&#xff0c;首先现场气氛会很热烈&#xff0c;主办方会很有面子&#xff0c;视频媒体不管是电视台还是视频网站&#xf…