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 父进程向子进程发送一条消息,子进程读取这条消息 例子2 mkfifo 函数创建一个命名管道 例子3 mkfifo 函数创建一个命名管道处理可能出现的错误 例子4 管道文件是否已存在 例子5 除了“文件已存在”进行处理 例子6 创建一个命名管道&…...

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

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

react 怎样配置ant design Pro 路由?
Ant Design Pro 是基于 umi 和 dva 的框架,umi 已经预置了路由功能,只需要在 config/router.config.js 中添加路由信息即可。 例如,假设你需要为 HelloWorld 组件创建一个路由,你可以将以下代码添加到 config/router.config.js 中…...
DBSCAN 算法【python,机器学习,算法】
DBSCAN 即 Density of Based Spatial Clustering of Applications with Noise,带噪声的基于空间密度聚类算法。 算法步骤: 初始化: 首先,为每个数据点分配一个初始聚类标签,这里设为0,表示该点尚未被分配…...

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

生成树协议STP(Spanning Tree Protocol)
为了提高网络可靠性,交换网络中通常会使用冗余链路。然而,冗余链路会给交换网络带来环路风险,并导致广播风暴以及MAC地址表不稳定等问题,进而会影响到用户的通信质量。生成树协议STP(Spanning Tree Protocol࿰…...
03-3.1.1 栈的基本概念
👋 Hi, I’m Beast Cheng👀 I’m interested in photography, hiking, landscape…🌱 I’m currently learning python, javascript, kotlin…📫 How to reach me --> 458290771qq.com 喜欢《数据结构》部分笔记的小伙伴可以订…...
排序算法集合
1. 冒泡排序 排序的过程分为多趟,在每一趟中,从前向后遍历数组的无序部分,通过交换相邻两数位置的方式,将无序元素中最大的元素移动到无序部分的末尾(第一趟中,将最大的元素移动到数组倒数第一的位置&…...

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

vite项目打包,内存溢出
解决方案: "build1": "node --max-old-space-size8096 ./node_modules/vite/bin/vite.js build", 人工智能学习网站 https://chat.xutongbao.top...

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

自养号测评助力:如何打造沃尔玛爆款?
沃尔玛,作为全球零售业的领军者,其平台为卖家们提供了一个巨大的商业舞台。然而,在这个竞争激烈的舞台上,如何迅速且有效地提升销量,成为了卖家们必须面对的重大挑战。 在探讨沃尔玛平台销量提升的策略时,我…...
C语言编译与链接
C语言编译与链接 目录 C语言编译与链接 一、概述 二、编译过程 三、链接过程...

电子电器架构 --- 智能座舱技术分类
电子电器架构 — 智能座舱技术分类 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,…...
提供操作日志、审计日志解决方案思路
操作日志 现在大部分公司一般使用SpringCloud这条技术栈,操作日志通过网关Gateway提供的Globalfilter统一拦截请求解析请求是比较好的选选择。 优点:相对于传统的过滤器、拦截器同步阻塞方案,SpringCloud Gateway使用的Webflux中的reactor-…...

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

echarts tooltip太多显示问题解决方案
思路:设置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文件中的特殊注释#, !,: xacro文件解析为字符串时出现报错 一开始疯狂报错Waiting for /controller_manager node to exist 1717585645.4673686 [spawner-2] [INFO] [1717585645.467015300] [spawner_joint_state_broadcaster]: Waiting for /con…...
深入对比:Transformer与LSTM的详细解析
在深度学习和自然语言处理(NLP)领域,Transformer和长短时记忆网络(LSTM)是两个备受瞩目的模型。它们各自拥有独特的优势,并在不同的任务中发挥着重要作用。本文将对这两种模型进行详细对比,帮助…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...

什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

Netty从入门到进阶(二)
二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架,用于…...

算法—栈系列
一:删除字符串中的所有相邻重复项 class Solution { public:string removeDuplicates(string s) {stack<char> st;for(int i 0; i < s.size(); i){char target s[i];if(!st.empty() && target st.top())st.pop();elsest.push(s[i]);}string ret…...

李沐--动手学深度学习--GRU
1.GRU从零开始实现 #9.1.2GRU从零开始实现 import torch from torch import nn from d2l import torch as d2l#首先读取 8.5节中使用的时间机器数据集 batch_size,num_steps 32,35 train_iter,vocab d2l.load_data_time_machine(batch_size,num_steps) #初始化模型参数 def …...
__VUE_PROD_HYDRATION_MISMATCH_DETAILS__ is not explicitly defined.
这个警告表明您在使用Vue的esm-bundler构建版本时,未明确定义编译时特性标志。以下是详细解释和解决方案: 问题原因: 该标志是Vue 3.4引入的编译时特性标志,用于控制生产环境下SSR水合不匹配错误的详细报告1使用esm-bundler…...

Java高级 |【实验八】springboot 使用Websocket
隶属文章:Java高级 | (二十二)Java常用类库-CSDN博客 系列文章:Java高级 | 【实验一】Springboot安装及测试 |最新-CSDN博客 Java高级 | 【实验二】Springboot 控制器类相关注解知识-CSDN博客 Java高级 | 【实验三】Springboot 静…...