当前位置: 首页 > news >正文

Linux C语言 39-进程间通信IPC之管道

Linux C语言 39-进程间通信IPC之管道

本节关键字:C语言 进程间通信 管道 FIFO
相关库函数:pipe、mkfifo、mknod、write、read

什么是管道?

管道通常指“无名管道”,是Unix系统中最古老的IPC通信方式。

管道的分类

  • 管道(无名管道)
  • FIFO(命名管道)

管道的特点

管道(无名管道)
  • 半双工,数据只能由连接的一端发送到另一端,并且读端和写端固定;
  • 只能用于具有亲缘关系的进程通信,如父子进程、兄弟进程;
  • 可以当成一种特殊的文件,不属于任何文件系统,只存在于内存中。读写使用read()和write等函数;
  • 管道有互斥功能,同一时间只能有一个进程从管道读取数据。
FIFO(命名管道)
  • FIFO是一种文件类型,有路径名,以一种特殊设备文件形式存在于文件系统中;
  • FIFO可以在无关的进程之间交换数据,这点与无名管道不同;
  • 管道有互斥功能,同一时间只能有一个进程从管道读取数据。

管道相关库函数

管道(无名管道)
#include <unistd.h>
int pipe(int fd[2]);
/**
@brief 创建管道,需要手动关闭管道,即手动关闭两个文件描述符
@param fd 承接管道创建时的两个文件描述符,fd[0]为读端描述符,fd[1]为写端描述符
@return 成功返回0,失败返回-1并设置错误码error错误码error类型:
EFAULT     pipefd无效
EINVAL     (pipe2())标志中的值无效
EMFILE  进程正在使用的文件描述符过多
ENFILE     打开文件总数已达到系统限制
*/
管道使用例程
// 管道使用例程:创建管道和进程,子进程读管道,父进程写管道
#include <sys/wait.h>
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>int main(int argc, char *argv[])
{int pipefd[2];pid_t cpid;char buf;assert(argc == 2);    // 断言:有一个命令行参数,argv[1]将被写入管道if (pipe(pipefd) == -1) {perror("pipe");exit(EXIT_FAILURE);}cpid = fork();if (cpid == -1) {perror("fork");exit(EXIT_FAILURE);}if (cpid == 0)        // 子进程:关闭写文件描述符,读管道{close(pipefd[1]);while (read(pipefd[0], &buf, 1) > 0)write(STDOUT_FILENO, &buf, 1);write(STDOUT_FILENO, "\n", 1);close(pipefd[0]);_exit(EXIT_SUCCESS);} else                   // 父进程:关闭读文件描述符,写管道,将命令行参数argv[1]写入管道{close(pipefd[0]);write(pipefd[1], argv[1], strlen(argv[1]));close(pipefd[1]);  // 读端将收到EOFwait(NULL);        // 等待子进程退出exit(EXIT_SUCCESS);}return 0;
}
FIFO(命名管道)
#include <sys/stat.h>
int mkfifo(const char *pathname, mode_t mode);
/**
@brief 创建FIFO管道,需要手动关闭管道,即手动关闭文件描述符。FIFO特殊文件不是匿名通信通道,而是通过调用mkfifo()输入到文件系统中
@param pathname FIFO的路径名,文件真实存在
@param mode 创建FIFO文件的权限,创建的文件的权限为(mode&~umask)
@return 成功返回0,失败返回-1并设置错误码error错误码error分类:
EACCES        路径名中的一个目录没有搜索(执行)权限
EEXIST        路径名已存在。这包括路径名是符号链接的情况,无论是否悬空
ENAMETOOLONG    路径名的总长度大于PATH_MAX,或者单个文件名组件的长度大于NAME_MAX。在GNU系统中,对文件名的总长度没有强制限制,但一些文件系统可能会对组件的长度进行限制
ENOENT        路径名中的目录组件不存在,或者是悬挂的符号链接
ENOSPC        目录或文件系统没有空间容纳新文件
ENOTDIR        在路径名中用作目录的组件实际上不是目录
EROFS        路径名是指只读文件系统Trip:一旦你以这种方式创建了一个FIFO特殊文件,任何进程都可以像普通文件一样打开它进行读取或写入。然而,在您可以继续对其进行任何输入或输出操作之前,它必须同时在两端打开。打开FIFO以正常读取块,直到其他进程打开相同的FIFO进行写入,反之亦然。有关fifo特殊文件的非阻塞处理,请参见fifo(7)。
*/
FIFO使用例程

FIFO使用例程:创建FIFO,多个个服务端读,多个个客户端写,验证管道的互斥功能

FIFO使用服务端例程
// FIFO使用例程 服务端,循环读取管道中的信息,直到管道的所有写端关闭
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>int main(void)
{char pathname[] = "./myfifo";int ret, fd;char buffer[1024];umask(0);ret = mkfifo(pathname, 0666);  // mode附加读写权限fd = open(pathname, O_RDONLY); // 服务端只读打开FIFO文件if (fd < 0)return -1;for ( ; ; ){bzero(buffer, 0);ret = read(fd, buffer, sizeof(buffer)-1);if (ret > 0){printf("server recv: %s\n", buffer);fflush(stdout);}else if (ret == 0){printf("server: client quit\n");break;}else{perror("server failed to read myfifo\n");break;}}close(fd);return 0;
}
FIFO使用客户端例程
// FIFO使用例程:客户端,将用户输入的信息写入管道,循环执行6次退出
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>int main(void)
{char pathname[] = "./myfifo";int ret, fd, cnt;char buffer[1024];fd = open(pathname, O_WRONLY);    // 客户端只写开打FIFO文件if (fd < 0)return -1;do{printf("please input message: ");fflush(stdout);bzero(buffer, 0);ret = read(STDIN_FILENO, buffer, sizeof(buffer)-1);if (ret <= 0){perror("read");}else{write(fd, buffer, ret);}} while (++cnt <= 5);close(fd);return 0;
}
运行结果
/// 从两个服务端的运行结果可知,管道有互斥功能,同一时刻只有一个进程可以从管道读取数据// 服务端1:
$ ./fifoserver 
server recv: client1: 1server recv: client2: 1server recv: client1: 2server recv: client1: 3server recv: client1: 5server recv: client2: 4server recv: client2: 6server: client quit// 服务端2:
$ ./fifoserver 
server recv: client1: 4server recv: client1: 6server recv: client2: 2server recv: client2: 3server recv: client2: 5server: client quit// 客户端1:
$ ./fifoclient 
please input message: client1: 1    
please input message: client1: 2
please input message: client1: 3
please input message: client1: 4
please input message: client1: 5
please input message: client1: 6// 客户端2:
$ ./fifoclient 
please input message: client2: 1
please input message: client2: 2     
please input message: client2: 3
please input message: client2: 4
please input message: client2: 5
please input message: client2: 6

启动server后使用ll命令查看目录文件信息,可以看到已经创建了myfifo文件
FIFO的创建

相关文章:

Linux C语言 39-进程间通信IPC之管道

Linux C语言 39-进程间通信IPC之管道 本节关键字&#xff1a;C语言 进程间通信 管道 FIFO 相关库函数&#xff1a;pipe、mkfifo、mknod、write、read 什么是管道&#xff1f; 管道通常指“无名管道”&#xff0c;是Unix系统中最古老的IPC通信方式。 管道的分类 管道&#…...

python pandas dataframe常用数据处理总结

最近一直在做数据处理相关的工作&#xff0c;有几点经常遇到的情况总结如下&#xff1a; 数据中存在为空数据如何处理 处理方式1&#xff1a;丢弃数据行 # 实现方式1 data data.dropna(subset[id]) # 若id列中某行数值为空&#xff0c;丢弃整行数据 # 实现方式2 data df[df…...

excel做预测的方法集合

一. LINEST函数 首先&#xff0c;一元线性回归的方程&#xff1a; y a bx 相应的&#xff0c;多元线性回归方程式&#xff1a; y a b1x1 b2x2 … bnxn 这里&#xff1a; y - 因变量即预测值x - 自变量a - 截距b - 斜率 LINEST的可以返回回归方程的 截距(a) 和 斜…...

12月8日作业

使用手动连接&#xff0c;将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数&#xff1b;将登录按钮使用qt5版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断u界面上输入的账号是否为"admin"&#xff0c;…...

RefCell 数据类型

内部可变性&#xff08;interior mutability&#xff09;是RUST的设计模式之一&#xff0c;它允许你在只持有不可变引用的前提下对数据进行修改。为了能改变数据&#xff0c;内部可变性模式在它的数据结构中使用了unsafe&#xff08;不安全&#xff09;代码来绕过RUST正常的可变…...

[oeasy]python0002_终端_CLI_GUI_编程环境_游戏_真实_元宇宙

回忆 上次 了解了 python 语言的特点 历史悠久功能强大深受好评已成趋势 3大主流操作系统 macwindowslinux 我们 选择 linux 作为基础系统 为什么选择 黑乎乎的命令行界面呢&#xff1f;&#x1f914; GUI vs CLI 个人电脑 用图标和菜单组成 图形界面(GUI) Graphic User I…...

微服务1 springcloud学习笔记P1-P40

b微服务技术栈_哔哩哔哩_bilibili 文档资料: 链接&#xff1a;https://pan.baidu.com/s/1P_Ag1BYiPaF52EI19A0YRw?pwdd03r 提取码&#xff1a;d03r 一 了解微服务技术 二 Eureka (1) Eureka配置 (2) 注册user-service (3) 总结 Ribbon 负载均衡 (1) 流程 三 nacos配置管理…...

【页面】表格展示

展示 Dom <template><div class"srch-result-container"><!--左侧--><div class"left"><div v-for"(item,index) in muneList" :key"index" :class"(muneIndexitem.mm)?active:"click"pa…...

天池SQL训练营(六)-综合练习题-10道经典题目

如果你还没有学习过SQL训练营的以下知识&#xff0c;请查阅主页博文学习&#xff1a; Task 1 SQL基础&#xff1a;初识数据库与SQL-安装与基本介绍等 Task 2 SQL基础&#xff1a;查询与排序-select、运算符、聚合分组查询等 Task 3 SQL进阶&#xff1a;复杂查询方法-视图、子查…...

某校园报名sign解密

某校园报名sign解密 定位 看了下确实是md5标准算法&#xff0c;接下来就看下加密的明文了 最后分开看了下&#xff0c; sign md5(用户名 活动id 10位时间戳 keys)...

2024年安防视频监控行业将面临4大机遇和挑战

当前安防监控市场处于快速发展的阶段&#xff0c;市场不仅有传统的视频监控、门禁系统等单一功能的设备&#xff0c;还涌现出了一系列集成多种安防功能的综合系统。随着人工智能技术的发展&#xff0c;安防监控设备不仅可以对场所进行实时监控&#xff0c;还可以通过图像识别、…...

搞懂HashTable, HashMap, ConcurrentHashMap 的区别,看着一篇就足够了!!!

&#x1f6e9;️&#x1f6e9;️&#x1f6e9;️ 今天给大家分享的是 HashTable, HashMap, ConcurrentHashMap之间的区别&#xff0c;也是自己学习过程中的总结。 清风的CSDN博客 &#x1f6e9;️&#x1f6e9;️&#x1f6e9;️希望我的文章能对你有所帮助&#xff0c;有不足的…...

PostgreSQL 技术内幕(十二) CloudberryDB 并行化查询之路

随着数据驱动的应用日益增多&#xff0c;数据查询和分析的量级和时效性要求也在不断提升&#xff0c;对数据库的查询性能提出了更高的要求。为了满足这一需求&#xff0c;数据库引擎不断经历创新&#xff0c;其中并行执行引擎是性能提升的重要手段之一&#xff0c;逐渐成为数据…...

Vue学习计划-Vue2--Vue核心(七)生命周期

抛出问题&#xff1a;一进入页面就开启一个定时器&#xff0c;每隔1秒count就加1&#xff0c;如何实现 示例&#xff1a; <body> <div id"app">{{ n }}<button click"add">执行</button> </div><script>let vm new …...

前端知识笔记(三十四)———HBuilder的下载与使用(详细步骤)

一、HBuilder IDE的下载 HBuilder下载官网地址&#xff1a; 在地址栏中直接输入https://www.dcloud.io 或者直接点击下面的链接 DCloud - HBuilder、HBuilderX、uni-app、uniapp、5、5plus、mui、wap2app、流应用、HTML5、小程序开发、跨平台App、多端框架 进入官网&#x…...

stl容器

大部分容器的size的复杂度如下&#xff1a; std::vector&#xff1a; 时间复杂度为(1). std::deque&#xff1a; 时间复杂度为 O(1). 双端队列 std::list&#xff1a; 时间复杂度为 O(1)&#xff08;C11 及以后的版本&#xff09;。 std::forward_list&#xff1a; 时间复…...

android https 证书过期

有的时候 我们android https 证书过期 &#xff0c;或者使用明文等方式去访问服务器 可能会碰到类似的 问题 &#xff1a; javax.net.ssl.SSLHandshakeException: Chain validation failed java.security.cert.CertPathValidatorException: Response is unreliable: its validi…...

lv11 嵌入式开发 中断控制器14

目录 1 中断控制器 ​编辑 2 Exynos4412下的中断控制器 2.1 概述 2.2 特征 ​编辑 2.3 中断状态 2.4 中断类型 2.5 中断控制器GIC中断表 3 中断控制器寄存器详解 3.1 ICDDCR&#xff08;Interrupt Controller Distributor Control Register&#xff09; 3.2 ICDISER…...

IDEA 出现问题:Idea-操作多次commit,如何合并为一个并push解决方案

❤️作者主页&#xff1a;小虚竹 ❤️作者简介&#xff1a;大家好,我是小虚竹。2022年度博客之星评选TOP 10&#x1f3c6;&#xff0c;Java领域优质创作者&#x1f3c6;&#xff0c;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;掘金年度人气作…...

贝蒂的捣蛋小游戏~(C语言)

引言&#xff1a; 前面贝蒂已经给大家介绍了选择&#xff0c;循环结构~&#xff0c;今天贝蒂就基于这两种结构&#xff0c;为大家讲解一种捣蛋小游戏的设计思路和方法哦。 1.游戏要求 游戏要求&#xff1a; 1. 电脑⾃动⽣成1~100的随机数 2. 玩家猜数字&#xff0c;猜数字的过…...

【杂谈】-递归进化:人工智能的自我改进与监管挑战

递归进化&#xff1a;人工智能的自我改进与监管挑战 文章目录 递归进化&#xff1a;人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管&#xff1f;3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留&#xff0c;CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制&#xff08;CCA-Attention&#xff09;&#xff0c;…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风&#xff0c;以**「云启出海&#xff0c;智联未来&#xff5c;打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办&#xff0c;现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见&#xff0c;必须要保持数据不可变&#xff0c;管理员都无法修改和留痕的要求。比如医疗的电子病历中&#xff0c;影像检查检验结果不可篡改行的&#xff0c;药品追溯过程中数据只可插入无法删除的特性需求&#xff1b;登录日志、修改日志…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述&#xff0c;后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作&#xff0c;其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

Robots.txt 文件

什么是robots.txt&#xff1f; robots.txt 是一个位于网站根目录下的文本文件&#xff08;如&#xff1a;https://example.com/robots.txt&#xff09;&#xff0c;它用于指导网络爬虫&#xff08;如搜索引擎的蜘蛛程序&#xff09;如何抓取该网站的内容。这个文件遵循 Robots…...

GitHub 趋势日报 (2025年06月08日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...