Linux -- 进程间通信的五种方式

IPC(InterProcess Communication)的方式通常有管道(包括无名管道和命名管道)、消息队列、信号量、共享存储、Socket、Streams等。其中Socket和Stream支持不同主机上的两个进程IPC。

  1. 管道(Pipes):管道是一种半双工的通信方式,用于具有亲缘关系的进程间通信。它通常用于父子进程或者兄弟进程之间。管道可以是匿名管道,也可以是命名管道。

  2. 消息队列(Message Queues):消息队列是一种通过消息传递进行通信的方式。发送方将消息发送到队列中,接收方从队列中接收消息。消息队列可以实现进程间的异步通信。

  3. 信号量(Semaphores):信号量是一种计数器,用于控制对共享资源的访问。它通常用于同步进程之间的操作,以避免竞争条件。

  4. 共享内存(Shared Memory):共享内存是一种允许多个进程访问同一块内存区域的方式。这种方式通常比较高效,但需要处理进程间的同步和互斥。

  5. 套接字(Sockets):套接字是一种网络编程接口,不仅可以用于不同主机间的进程通信,也可以用于同一主机上的进程通信。套接字可以基于网络协议(如TCP/IP)或本地协议(如UNIX域套接字)实现。

一、管道

管道(Pipes)是一种在Unix和类Unix系统中常见的进程间通信(IPC)机制,用于在具有亲缘关系的进程之间传递数据。管道是一个单向通道,允许一个进程将输出直接发送到另一个进程的输入。它是一种半双工通信方式,即数据只能单向流动,不能双向传输。

类型

  1. 匿名管道(Anonymous Pipes):匿名管道是最简单的管道形式,它只存在于内存中,并且通常用于父子进程之间的通信。在Unix系统中,可以使用pipe()系统调用创建匿名管道。

  2. 命名管道(Named Pipes):命名管道是一种具有持久性的管道,它以文件的形式存在于文件系统中,并允许无关进程之间进行通信。命名管道通常用于不具有亲缘关系的进程之间的通信。

特点

  • 单向通信:管道是单向的,数据只能沿着管道的方向流动,不能双向传输。

  • 半双工:管道是半双工的,即数据只能在一个方向上传输。如果需要双向通信,通常需要创建两个管道。

  • FIFO(先进先出):管道遵循FIFO的原则,即数据按照写入的顺序从管道中读取出来。

使用

在Unix系统中,可以使用pipe()系统调用创建匿名管道,它返回两个文件描述符,一个用于读取,一个用于写入。然后可以使用fork()创建一个新的进程,在父子进程之间共享管道,并使用dup2()系统调用将管道文件描述符重定向到标准输入或标准输出。接着,一个进程可以通过写入管道的方式向另一个进程发送数据,另一个进程则可以通过读取管道来接收数据。

示例

下面是一个简单的C语言示例,演示了如何在父子进程之间使用匿名管道进行通信:

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <sys/wait.h>int main()
{int fd[2];int pid;char buf[128];//创建管道if(pipe(fd) == -1) { printf("creat pipe failed\n");}//创建子进程pid = fork();if(pid < 0) {printf("creat child faild\n");} else if(pid > 0) {    //父进程printf("this is father\n");close(fd[0]); //关闭读取端//向管道写数据write(fd[1], "hello from father", strlen("hello from father"));wait(NULL);} else {printf("this is child\n");close(fd[1]); //关闭写入端read(fd[0], buf, sizeof(buf));  //从管道读数据printf("child print: %s\n", buf);exit(1);}return 0;
}

程序执行结果如下: 

 

命名管道(Named Pipes)的使用:

命名管道是一种具有持久性的管道,它以文件的形式存在于文件系统中,并允许无关进程之间进行通信。相比于匿名管道,命名管道允许不具有亲缘关系的进程之间进行通信。

创建命名管道

在Unix/Linux系统中,可以使用mkfifo()函数创建命名管道。命名管道创建后,会在文件系统中生成一个特殊类型的文件,它可以像普通文件一样被打开、读取和写入。

使用命名管道

使用命名管道和使用普通文件一样,可以使用文件I/O操作来读取和写入数据。不同的是,命名管道的数据读取和写入是以先进先出(FIFO)的方式进行的,即写入的数据按照写入的顺序从管道中读取出来。

特点

  • 命名管道是持久性的,创建后会一直存在于文件系统中,直到被显式删除。
  • 允许不具有亲缘关系的进程之间进行通信。
  • 数据按照写入的顺序从管道中读取出来,具有先进先出(FIFO)的特性。

 

示例

下面是一个简单的C语言示例,演示了如何创建和使用命名管道:

先介绍一下mkfifo:mkfifo 是用于创建命名管道(FIFO)的系统调用。在 Unix 和类 Unix 系统中,命名管道以文件的形式存在,可以用于不同进程之间进行通信。

mkfifo 函数原型

#include <sys/types.h>
#include <sys/stat.h>int mkfifo(const char *pathname, mode_t mode);

参数

  • pathname:要创建的命名管道的路径。
  • mode:管道的权限,类似于 openchmod 中使用的权限位。常用权限包括 0666(表示管道文件可读可写)。

返回值

  • 成功时返回 0
  • 失败时返回 -1,并设置 errno 以指示错误。

 注意:

命名管道的读写操作是同步的,这意味着:

  • 写入进程会等待直到有读取进程打开管道进行读取。
  • 读取进程会等待直到有写入进程向管道写入数据。

这导致如果你先运行写入程序而没有相应的读取程序在运行,写入程序会阻塞,等待读取程序打开管道读取数据。同样地,如果你先运行读取程序而没有写入程序在运行,读取程序会阻塞,等待写入程序向管道写入数据。

为了避免这个问题,可以按以下步骤运行程序:

  1. 先运行读取程序 reader,使其准备好从管道读取数据。
  2. 然后运行写入程序 writer,向管道写入数据。
writer.c (写入程序)
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>#define FIFO_FILE "/tmp/my_fifo"int main() {// 创建命名管道,权限模式为 0600if (mkfifo(FIFO_FILE, 0600) == -1) {perror("mkfifo failed");exit(EXIT_FAILURE);}// 打开命名管道以写入数据int fd = open(FIFO_FILE, O_WRONLY);if (fd == -1) {perror("open failed");exit(EXIT_FAILURE);}// 写入数据到命名管道const char *message = "Hello, Named Pipe!";write(fd, message, sizeof(message));// 关闭文件描述符close(fd);return 0;
}
reader.c (读取程序)
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>#define FIFO_FILE "/tmp/my_fifo"int main() {char buffer[BUFSIZ];// 打开命名管道以读取数据int fd = open(FIFO_FILE, O_RDONLY);if (fd == -1) {perror("open failed");exit(EXIT_FAILURE);}// 从命名管道读取数据read(fd, buffer, sizeof(buffer));printf("Received: %s\n", buffer);// 关闭文件描述符close(fd);// 删除命名管道文件unlink(FIFO_FILE);return 0;
}

程序运行结果:

 

 

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

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

相关文章

STM32中断编程入门

文章目录 一、 理论部分1.中断系统2.中断执行流程3.NVIC的基本结构4.EXTI介绍5.AFIO复用IO口 二、实验目的&#xff1a;学习stm32中断原理和开发编程方法。使用标准完成以下任务&#xff1a;&#xff08;一&#xff09;实验一 开关控制LED的亮灭1.代码部分2.运行结果 &#xff…

【简单易用,新人友好】一个轻量级生物信息学流程框架,从此解决99%的生物信息学流程搭建问题...

生物信息学数据分析流程的搭建是一项繁重而复杂的工作。随着行业的发展&#xff0c;各种生信流程框架层出不穷&#xff0c;比如有: NextflowSnakemakeCWLWDL 各种标准&#xff0c;各种规则&#xff0c;令人眼花缭乱。选择太多&#xff0c;往往令人无所适从。特别是新进入行业的…

小程序的深层了解

一:wxss的全局样式和局部样式 写在文件上,第一个路径会执行全局和局部自带的wxss给wxml,会执行wxml,会执行json和js. 无论那个文件都会执行文件夹内的和外部的app.wxss,但是如果有一样的属性,则看属性的权重,权重一样,则设置局部样式. 二:全局配置 wx:key"写的是data内…

17.7K星开源产品分析平台:Posthog

Posthog&#xff1a;开源洞察&#xff0c;产品优化的得力助手 - 精选真开源&#xff0c;释放新价值。 概览 PostHog是一个全面开源的平台&#xff0c;旨在帮助团队构建更好的产品。它提供了从产品分析到会话回放、功能标志和A/B测试等一系列工具&#xff0c;支持自托管&#x…

读人工智能时代与人类未来笔记14_管控人工智能

1. 管控人工智能 1.1. 历史上的战场进一步推进到与数字网络相连的所有地方 1.2. 数字程序现在控制着一个由众多实体系统构成的庞大且仍在不断增长的领域&#xff0c;而且越来越多的此类系统已实现网络化 1.2.1. 在某些情况下甚至连门锁和冰箱都实现了网络化 1.2.2. 这催生出…

2024年汉字小达人活动4个多月开赛:18道历年选择题和答案、解析

根据近年的安排&#xff0c;2024年第11届汉字小达人比赛还有4个多月就启动&#xff0c;那么孩子们如何利用这段时间有条不紊地备考呢&#xff1f;我的建议是两手准备&#xff1a;①把小学1-5年级的语文课本上的知识点熟悉&#xff0c;重点是字、词、成语、古诗。②把历年真题刷…

联想端游联运SDK接入指南

1. 接入流程 本文档主要介绍了 联想PC游戏SDK接入流程、联想游戏提供的功能、接入注意事项等。 1.1. 接入方式 1. 联想游戏SDK2.1版本支持“账号防沉迷支付”接入方式&#xff1b; a. 联想提供账号注册、登录等能力 b. 联想提供防沉迷服务 c. 联想提供游戏内支付 1.2. 对…

【学习笔记】计算机组成原理(八)

CPU 的结构和功能 文章目录 CPU 的结构和功能8.1 CPU的结构8.1.1 CPU的功能8.1.2 CPU结构框图8.1.3 CPU的寄存器8.1.4 控制单元CU和中断系统 8.2 指令周期8.2.1 指令周期的基本概念8.2.2 指令周期的数据流 8.3 指令流水8.3.1 指令流水原理8.3.2 影响流水线性能的因素8.3.3 流水…

数据库-SQL性能分析

SQL执行频率 慢查询日志 慢查询日志记录了所有执行时间超过指定参数&#xff08;long_query_time&#xff0c;单位&#xff1a;秒&#xff0c;默认10秒&#xff09;的所有 SQL语句的日志。 MySQL的慢查询日志默认没有开启&#xff0c;我们可以查看一下系统变量 slow_query_l…

html5 笔记02

目录 01 svg的基本使用 02 svg绘图 03 进程和线程 01 svg的基本使用 svg和canvas的区别: canvas: 1.canvas作为一个容器只有一个dom元素 ,内部元素无法使用dom操作 (canvas不能展开然后选择不到 svg查看元素能选中因为是通过标签控制的) 2.canvas 是配合js完成各种绘制效果 …

指纹识别概念解析

目录 1. 指纹是物证之首 1.1 起源于中国 1.2 发展于欧洲 1.3 流行于全世界 2. 指纹图像 3. 指纹特征 4. 指纹注册 5. 指纹验证 6. 指纹辨识 1. 指纹是物证之首 指纹识别技术起源于中国、发展于欧洲、流行于全世界。自20世纪以来&#xff0c;指纹在侦破刑事案件、解决诉…

水泥超低排平台哪家好?

随着环保政策的加强和绿色发展理念的深入人心&#xff0c;水泥行业的超低排放改造已成为行业发展的新趋势。选择一个合适的水泥超低排平台对于确保改造效果和实现企业的可持续发展至关重要。朗观视觉小编将从多个角度出发&#xff0c;为您提供一份综合评估与选择攻略&#xff0…

[C语言]自定义类型详解:结构体、联合体、枚举

目录 &#x1f680;结构体 &#x1f525;结构体类型的声明 &#x1f525;结构的自引用 &#x1f525;结构体变量的定义和初始化 &#x1f525;结构体内存对齐 &#x1f525;结构体传参 &#x1f525;结构体实现位段&#xff08;位段的填充&可移植性&#xff09; &a…

安装 Ubuntu桌面版,详细步骤(附引导 U盘制作工具)

下载镜像 安装Ubuntu首先要下载镜像包&#xff0c;访问下面网址下载镜像包 https://releases.ubuntu.com/ 选择你要安装的Ubuntu版本 将 .iso 文件保存到所需位置&#xff0c;下面会使用此文件创建可引导 U盘。 制作 Ubuntu 引导 U 盘 首先要找到一个大于4G的U盘&#xff…

猫头虎 解析:为什么AIGC在国内适合做TOB,在国外适合做TOC?

猫头虎 解析&#xff1a;为什么AIGC在国内适合做TOB&#xff0c;在国外适合做TOC&#xff1f; 博主 猫头虎 的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面…

ps进程查看命令详解

1、PS 命令是什么 查看它的man手册可以看到&#xff0c;ps命令能够给出当前系统中进程的快照。它能捕获系统在某一事件的进程状态。如果你想不断更新查看的这个状态&#xff0c;可以使用top命令。 2、ps命令支持三种使用的语法格式 UNIX 风格&#xff0c;选项可以组合在一起…

鸿蒙ArkUI-X平台差异化:【运行态差异化(@ohos.deviceInfo)】

平台差异化 简介 跨平台使用场景是一套ArkTS代码运行在多个终端设备上&#xff0c;如Android、iOS、OpenHarmony&#xff08;含基于OpenHarmony发行的商业版&#xff0c;如HarmonyOS Next&#xff09;。当不同平台业务逻辑不同&#xff0c;或使用了不支持跨平台的API&#xf…

Postman快捷功能-批量断言与快速查询替换

大家好&#xff0c;在我们日常的接口测试工作中&#xff0c;经常需要对接口返回的数据进行断言&#xff0c;以确保接口的正确性。当接口数量较多时&#xff0c;逐个编写断言语句会变得非常繁琐。此外&#xff0c;在接口测试过程中&#xff0c;我们还可能需要频繁地查找和替换某…

Python自动化工具(桌面自动化、Web自动化、游戏辅助)

工具介绍 连点工具是一款可以模拟键鼠后台操作的连点器工具。支持鼠标连点、键鼠脚本录制&#xff0c;支持辅助您实现办公自动化以及辅助游戏操作。功能简洁易用&#xff0c;非常方便操作。连点工具让您在在玩游戏、网购抢购的时候全自动点击鼠标&#xff01;主要功能有&#…

MySQL数据库的数据文件保存在哪?MySQL数据存在哪里

在安装好MySQL数据库使用一段时间后&#xff0c;会产生许多的数据库和数据。那这些数据库的数据文件存放在本地文件夹的什么位置呢 一、默认位置 一般来说MySQL数据库的数据文件都是存放在data文件夹之中&#xff0c;但是根据使用的存储引擎不同&#xff0c;产生的一些文件也…