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

linux学习:进程通信 管道

目录

例子1  父进程向子进程发送一条消息,子进程读取这条消息

例子2  mkfifo 函数创建一个命名管道

例子3    mkfifo 函数创建一个命名管道处理可能出现的错误

例子4   管道文件是否已存在

例子5   除了“文件已存在”进行处理

例子6   创建一个命名管道,并尝试打开它以进行读取

例子7   创建一个命名管道(FIFO),打开它用于读取数据,并循环读取来自管道的数据,直到程序被手动终止

例子8   持续写入特定消息到命名管道中直到达到指定次数后终止

例子9   打开一个已存在的命名管道(FIFO)以进行写操作


例子1  父进程向子进程发送一条消息,子进程读取这条消息

#include <stdio.h>  // 包含标准输入输出函数库
#include <unistd.h>  // 包含各种系统调用和基本的函数声明,如fork(), pipe(), read(), write()
#include <string.h> // 包含字符串处理函数库
#include <stdlib.h> // 包含标准库函数,如exit()int main()
{int fd[2];  // 用于存储管道的文件描述符,fd[0]用于读,fd[1]用于写int pid;  // 用于存储进程IDchar buf[128];  // 缓冲区,用于存储从管道读取的数据// 创建管道if(pipe(fd) == -1){printf("create pipe failed\n");return -1;  // 管道创建失败时,打印错误信息并退出程序}pid = fork();  // 创建子进程if(pid < 0){  // fork失败printf("create child failed\n");return -1;  // 进程创建失败时,打印错误信息并退出程序}else if(pid > 0){  // 父进程执行的分支sleep(3);  // 父进程等待3秒,确保子进程准备好接收数据printf("this is father\n");close(fd[0]);  // 父进程关闭管道的读端write(fd[1], "hello from father", strlen("hello from father"));  // 向管道写入数据wait();  // 等待子进程结束} else {  // 子进程执行的分支printf("this is child\n");close(fd[1]);  // 子进程关闭管道的写端read(fd[0], buf, 128);  // 从管道读取数据printf("read from father: %s\n", buf);  // 打印从父进程读取的数据exit(0);  // 子进程正常退出}return 0;  // 主程序正常结束
}

例子2  mkfifo 函数创建一个命名管道

#include <sys/types.h>  // 包含数据类型定义,如pid_t、mode_t
#include <sys/stat.h>   // 包含文件状态定义,用于文件操作,如mkfifo// 主函数入口
int main()
{// 使用mkfifo系统调用创建一个名为"./file"的命名管道// 参数 "./file" 是命名管道的路径和名称// 参数 0600 是设置文件的权限,表示只有所有者有读写权限// 0600 对应于八进制,实际权限是 -rw------- mkfifo("./file", 0600);return 0;  // 返回0,正常结束程序
}

例子3    mkfifo 函数创建一个命名管道处理可能出现的错误

#include <sys/types.h>  // 包含数据类型定义,如pid_t、mode_t
#include <sys/stat.h>   // 包含文件状态定义,用于文件操作,如mkfifo
#include <stdio.h>      // 包含标凈输入输出库函数// 主函数入口
int main()
{// 尝试创建一个名为"./file"的命名管道,设置权限为0600(只有所有者有读写权限)int ret = mkfifo("./file", 0600);// 判断mkfifo函数的返回值if(ret == 0){  // 如果返回值为0,说明命名管道创建成功printf("mkfifo success\n");  // 输出成功消息}if(ret == -1){  // 如果返回值为-1,说明命名管道创建失败printf("mkfifo failure\n");  // 输出失败消息perror("why");  // 使用perror输出错误原因,它会根据全局变量errno来描述错误详情}		return 0;  // 程序正常结束,返回0
}

例子4   管道文件是否已存在

#include <sys/types.h>  // 包含数据类型定义,用于多种系统调用
#include <sys/stat.h>   // 包含文件属性的定义,用于文件权限设置
#include <stdio.h>      // 包含标准输入输出函数库
#include <errno.h>      // 包含错误号定义,用于错误处理// 主函数入口
int main()
{// 尝试创建一个命名管道,路径为"./file",权限为0600(只有文件所有者有读写权限)if((mkfifo("./file", 0600) == -1) && errno == EEXIST){  // 如果创建失败且错误号为EEXIST(文件已存在)printf("mkfifo failure\n");  // 打印失败消息perror("why");  // 使用perror输出错误原因}else{if(errno == EEXIST){  // 如果创建管道时未进入第一个条件分支,但错误号仍然为EEXISTprintf("file exists\n");  // 打印文件已存在的消息} else {printf("mkfifo success\n");  // 否则打印成功创建管道的消息}}       return 0;  // 程序正常结束
}

例子5   除了“文件已存在”进行处理

#include <sys/types.h>  // 包含系统数据类型定义
#include <sys/stat.h>   // 包含文件状态和权限定义
#include <stdio.h>      // 包含标准输入输出函数库
#include <errno.h>      // 包含错误号定义,用于错误处理// 主函数入口
int main()
{// 尝试创建一个命名管道,路径为"./file",权限为0600(只有文件所有者有读写权限)if((mkfifo("./file", 0600) == -1) && errno != EEXIST){  // 如果创建失败且错误号不是EEXIST(文件已存在)printf("mkfifo failure\n");  // 打印失败消息perror("why");  // 使用perror输出具体的错误原因}// 如果创建失败但错误原因是文件已存在(EEXIST),则不执行任何操作,也不打印错误消息return 0;  // 程序正常结束
}

例子6   创建一个命名管道,并尝试打开它以进行读取

#include <sys/types.h>  // 包含系统数据类型定义
#include <sys/stat.h>   // 包含文件状态和权限定义
#include <stdio.h>      // 包含标准输入输出函数库
#include <errno.h>      // 包含错误号定义,用于错误处理
#include <fcntl.h>      // 包含文件控制系统调用,如open// 主函数入口
int main()
{// 尝试创建一个名为"./file"的命名管道,设置权限为0600(只有文件所有者有读写权限)if ((mkfifo("./file", 0600) == -1) && errno != EEXIST) {  // 如果创建失败且错误号不是EEXIST(文件已存在)printf("mkfifo failure\n");  // 打印失败消息perror("why");  // 使用perror输出具体的错误原因}// 如果创建命名管道成功或错误原因是文件已存在,继续执行// 打开刚创建的命名管道文件,以只读模式打开int fd = open("./file", O_RDONLY);if (fd == -1) {  // 检查文件是否成功打开perror("Open failed");  // 打开失败,输出错误信息return -1;  // 返回非零值表示程序异常结束}printf("open success\n");  // 打开成功,输出成功消息// 实际使用中应该在这里进行读取操作,然后处理数据// 不再使用文件时,应该关闭文件描述符close(fd);return 0;  // 程序正常结束
}

例子7   创建一个命名管道(FIFO),打开它用于读取数据,并循环读取来自管道的数据,直到程序被手动终止

#include <sys/types.h>  // 包含系统数据类型定义
#include <sys/stat.h>   // 包含文件状态定义,用于文件操作,如mkfifo
#include <stdio.h>      // 包含标准输入输出函数库
#include <errno.h>      // 包含错误号定义,用于错误处理
#include <fcntl.h>      // 包含文件控制系统调用,如openint main()
{char buf[30] = {0};  // 定义一个字符数组用于接收读取的数据,初始化所有元素为0int nread = 0;       // 用于存储read函数返回的实际读取字节数// 尝试创建命名管道"./file",权限设置为0600(只有文件所有者有读写权限)if ((mkfifo("./file", 0600) == -1) && errno != EEXIST) {printf("mkfifo failure\n");  // 如果创建失败并且错误不是因为文件已存在,打印失败消息perror("why");  // 使用perror输出错误的详细原因return -1;      // 创建失败,返回非零值表示程序异常结束}// 打开命名管道,只读模式int fd = open("./file", O_RDONLY);if (fd == -1) {  // 检查文件是否成功打开perror("Open failed");  // 打开失败,输出错误信息return -1;  // 返回非零值表示程序异常结束}printf("open success\n");  // 打开成功,输出成功消息// 循环读取管道中的数据while (1) {nread = read(fd, buf, 30);  // 从管道文件中读取最多30个字符到buf中if (nread == -1) {  // 检查读取是否成功perror("Read failed");  // 读取失败,输出错误信息close(fd);  // 关闭文件描述符return -1;  // 返回非零值表示程序异常结束}printf("read %d bytes from fifo, context: %s\n", nread, buf);if (nread == 0) {  // 如果没有数据可读(读到EOF)break;  // 退出循环}}close(fd);  // 循环结束后,关闭文件描述符return 0;  // 程序正常结束
}

例子8   持续写入特定消息到命名管道中直到达到指定次数后终止

#include <sys/types.h>  // 包含数据类型定义,如pid_t
#include <sys/stat.h>   // 包含文件状态定义,用于文件操作,如mkfifo
#include <stdio.h>      // 包含标准输入输出函数库
#include <errno.h>      // 包含错误号定义,用于错误处理
#include <fcntl.h>      // 包含文件控制系统调用,如open
#include <string.h>     // 包含字符串处理函数库
#include <unistd.h>     // 包含常用的系统调用,如sleepint main()
{int cnt = 0;  // 用于计数,记录已写入消息的次数char *str = "message from fifo";  // 定义要写入管道的消息// 尝试以只写模式打开名为"./file"的FIFOint fd = open("./file", O_WRONLY);if (fd == -1) {  // 检查文件是否成功打开perror("Open error");  // 打开失败,输出错误信息return -1;  // 程序异常退出}printf("write open success\n");  // 打开成功,打印确认消息// 循环写入数据到FIFOwhile(1){write(fd, str, strlen(str));  // 向FIFO写入字符串sleep(1);  // 每次写入后暂停1秒cnt++;  // 更新计数器if(cnt == 5){break;  // 当写入5次后跳出循环}}close(fd);  // 关闭FIFO文件描述符return 0;  // 程序正常结束
}

例子9   打开一个已存在的命名管道(FIFO)以进行写操作

#include <sys/types.h>  // 包含系统数据类型定义
#include <sys/stat.h>   // 包含文件状态定义,用于文件操作,如mkfifo
#include <stdio.h>      // 包含标准输入输出函数库
#include <errno.h>      // 包含错误号定义,用于错误处理
#include <fcntl.h>      // 包含文件控制系统调用,如openint main()
{// 尝试以只写模式打开名为 "./file" 的 FIFOint fd = open("./file", O_WRONLY);if (fd == -1) {  // 检查文件是否成功打开perror("Open error");  // 打开失败,输出错误信息return -1;  // 程序异常退出}printf("write open success\n");  // 打开成功,打印确认消息// 此处应添加写操作,但当前示例仅演示打开操作// 关闭文件描述符close(fd);return 0;  // 程序正常结束
}

相关文章:

linux学习:进程通信 管道

目录 例子1 父进程向子进程发送一条消息&#xff0c;子进程读取这条消息 例子2 mkfifo 函数创建一个命名管道 例子3 mkfifo 函数创建一个命名管道处理可能出现的错误 例子4 管道文件是否已存在 例子5 除了“文件已存在”进行处理 例子6 创建一个命名管道&…...

重大变化,2024软考!

根据官方发布的2024年度计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试安排&#xff0c;2024年软考上、下半年开考科目有着巨大变化&#xff0c;我为大家整理了相关信息&#xff0c;大家可以看看&#xff01; &#x1f3af;2024年上半年&#xff1a;5月25日&am…...

DRIVEN|15分的CNN+LightGBM怎么做特征分类,适用于转录组

说在前面 今天分享一篇做深度学习模型的文章&#xff0c;这是一篇软硬结合的研究&#xff0c;排除转换实体产品&#xff0c;我们做生信基础研究的可以学习模仿这个算法&#xff0c;适用且不局限于临床资料&#xff0c;转录组数据&#xff0c;GWAS数据。 今天给大家分享的一篇文…...

react 怎样配置ant design Pro 路由?

Ant Design Pro 是基于 umi 和 dva 的框架&#xff0c;umi 已经预置了路由功能&#xff0c;只需要在 config/router.config.js 中添加路由信息即可。 例如&#xff0c;假设你需要为 HelloWorld 组件创建一个路由&#xff0c;你可以将以下代码添加到 config/router.config.js 中…...

DBSCAN 算法【python,机器学习,算法】

DBSCAN 即 Density of Based Spatial Clustering of Applications with Noise&#xff0c;带噪声的基于空间密度聚类算法。 算法步骤&#xff1a; 初始化&#xff1a; 首先&#xff0c;为每个数据点分配一个初始聚类标签&#xff0c;这里设为0&#xff0c;表示该点尚未被分配…...

MySQL之查询性能优化(六)

查询性能优化 查询优化器 9.等值传播 如果两个列的值通过等式关联&#xff0c;那么MySQL能够把其中一个列的WHERE条件传递到另一列上。例如&#xff0c;我们看下面的查询: mysql> SELECT film.film_id FROM film-> INNER JOIN film_actor USING(film_id)-> WHERE f…...

生成树协议STP(Spanning Tree Protocol)

为了提高网络可靠性&#xff0c;交换网络中通常会使用冗余链路。然而&#xff0c;冗余链路会给交换网络带来环路风险&#xff0c;并导致广播风暴以及MAC地址表不稳定等问题&#xff0c;进而会影响到用户的通信质量。生成树协议STP&#xff08;Spanning Tree Protocol&#xff0…...

03-3.1.1 栈的基本概念

&#x1f44b; Hi, I’m Beast Cheng&#x1f440; I’m interested in photography, hiking, landscape…&#x1f331; I’m currently learning python, javascript, kotlin…&#x1f4eb; How to reach me --> 458290771qq.com 喜欢《数据结构》部分笔记的小伙伴可以订…...

排序算法集合

1. 冒泡排序 排序的过程分为多趟&#xff0c;在每一趟中&#xff0c;从前向后遍历数组的无序部分&#xff0c;通过交换相邻两数位置的方式&#xff0c;将无序元素中最大的元素移动到无序部分的末尾&#xff08;第一趟中&#xff0c;将最大的元素移动到数组倒数第一的位置&…...

pdf文件太大如何变小,苹果电脑压缩pdf文件大小工具软件

压缩PDF文件是我们在日常办公和学习中经常会遇到的需求。PDF文件由于其跨平台、保持格式不变的特点&#xff0c;被广泛应用于各种场合。然而&#xff0c;有时候我们收到的PDF文件可能过大&#xff0c;不便于传输和存储&#xff0c;这时候就需要对PDF文件进行压缩。下面&#xf…...

vite项目打包,内存溢出

解决方案&#xff1a; "build1": "node --max-old-space-size8096 ./node_modules/vite/bin/vite.js build", 人工智能学习网站 https://chat.xutongbao.top...

Matlab解决施密特正交规范化矩阵(代码开源)

#最近在学习matlab&#xff0c;刚好和线代论文重合了 于是心血来潮用matlab建了一个模型来解决施密特正交规范化矩阵。 我们知道这个正交化矩阵挺公式化的&#xff0c;一般公式化的内容我们都可以用计算机来进行操作&#xff0c;节约我们人工的时间。 我们首先把矩阵导入进去…...

自养号测评助力:如何打造沃尔玛爆款?

沃尔玛&#xff0c;作为全球零售业的领军者&#xff0c;其平台为卖家们提供了一个巨大的商业舞台。然而&#xff0c;在这个竞争激烈的舞台上&#xff0c;如何迅速且有效地提升销量&#xff0c;成为了卖家们必须面对的重大挑战。 在探讨沃尔玛平台销量提升的策略时&#xff0c;我…...

C语言编译与链接

C语言编译与链接 目录 C语言编译与链接 一、概述 二、编译过程 三、链接过程...

电子电器架构 --- 智能座舱技术分类

电子电器架构 — 智能座舱技术分类 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,…...

提供操作日志、审计日志解决方案思路

操作日志 现在大部分公司一般使用SpringCloud这条技术栈&#xff0c;操作日志通过网关Gateway提供的Globalfilter统一拦截请求解析请求是比较好的选选择。 优点&#xff1a;相对于传统的过滤器、拦截器同步阻塞方案&#xff0c;SpringCloud Gateway使用的Webflux中的reactor-…...

选择富唯智能的可重构装配系统,就是选择了一个可靠的合作伙伴

在数字化、智能化的浪潮中&#xff0c;制造业正迎来一场前所未有的变革。而在这场变革中&#xff0c;富唯智能凭借其卓越的技术实力和创新能力&#xff0c;成为引领行业发展的领军企业。选择富唯智能的可重构装配系统&#xff0c;就是选择了一个可靠的合作伙伴&#xff0c;共同…...

echarts tooltip太多显示问题解决方案

思路&#xff1a;设置5个一换行 tooltip: {trigger: axis,confine:true,//限制tooltip在图表范围内展示// extraCssText: max-height:60%;overflow-y:scroll,//最大高度以及超出处理extraCssText: max-height:60%;overflow-y:scroll;white-space: normal;word-break: break-al…...

【control_manager】无法加载,gazebo_ros2_control 0.4.8,机械臂乱飞

删除URDF和SDRF文件中的特殊注释#, !,&#xff1a; xacro文件解析为字符串时出现报错 一开始疯狂报错Waiting for /controller_manager node to exist 1717585645.4673686 [spawner-2] [INFO] [1717585645.467015300] [spawner_joint_state_broadcaster]: Waiting for /con…...

深入对比:Transformer与LSTM的详细解析

在深度学习和自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;Transformer和长短时记忆网络&#xff08;LSTM&#xff09;是两个备受瞩目的模型。它们各自拥有独特的优势&#xff0c;并在不同的任务中发挥着重要作用。本文将对这两种模型进行详细对比&#xff0c;帮助…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文&#xff5c;魏琳华 编&#xff5c;王一粟 一场大会&#xff0c;聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中&#xff0c;汇集了学界、创业公司和大厂等三方的热门选手&#xff0c;关于多模态的集中讨论达到了前所未有的热度。其中&#xff0c;…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

工程地质软件市场:发展现状、趋势与策略建议

一、引言 在工程建设领域&#xff0c;准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具&#xff0c;正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

Python如何给视频添加音频和字幕

在Python中&#xff0c;给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加&#xff0c;包括必要的代码示例和详细解释。 环境准备 在开始之前&#xff0c;需要安装以下Python库&#xff1a;…...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 代码如下&#xff1a; class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

AI书签管理工具开发全记录(十九):嵌入资源处理

1.前言 &#x1f4dd; 在上一篇文章中&#xff0c;我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源&#xff0c;方便后续将资源打包到一个可执行文件中。 2.embed介绍 &#x1f3af; Go 1.16 引入了革命性的 embed 包&#xff0c;彻底改变了静态资源管理的…...

管理学院权限管理系统开发总结

文章目录 &#x1f393; 管理学院权限管理系统开发总结 - 现代化Web应用实践之路&#x1f4dd; 项目概述&#x1f3d7;️ 技术架构设计后端技术栈前端技术栈 &#x1f4a1; 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 &#x1f5c4;️ 数据库设…...

现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?

现有的 Redis 分布式锁库&#xff08;如 Redisson&#xff09;相比于开发者自己基于 Redis 命令&#xff08;如 SETNX, EXPIRE, DEL&#xff09;手动实现分布式锁&#xff0c;提供了巨大的便利性和健壮性。主要体现在以下几个方面&#xff1a; 原子性保证 (Atomicity)&#xff…...