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)是两个备受瞩目的模型。它们各自拥有独特的优势,并在不同的任务中发挥着重要作用。本文将对这两种模型进行详细对比,帮助…...
[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 安全措施依赖问题 GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...
CSS | transition 和 transform的用处和区别
省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...

wpf在image控件上快速显示内存图像
wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像(比如分辨率3000*3000的图像)的办法,尤其是想把内存中的裸数据(只有图像的数据,不包…...

Ubuntu系统多网卡多相机IP设置方法
目录 1、硬件情况 2、如何设置网卡和相机IP 2.1 万兆网卡连接交换机,交换机再连相机 2.1.1 网卡设置 2.1.2 相机设置 2.3 万兆网卡直连相机 1、硬件情况 2个网卡n个相机 电脑系统信息,系统版本:Ubuntu22.04.5 LTS;内核版本…...

VSCode 使用CMake 构建 Qt 5 窗口程序
首先,目录结构如下图: 运行效果: cmake -B build cmake --build build 运行: windeployqt.exe F:\testQt5\build\Debug\app.exe main.cpp #include "mainwindow.h"#include <QAppli...

react更新页面数据,操作页面,双向数据绑定
// 路由不是组件的直接跳转use client,useEffect,useRouter,需3个结合, use client表示客户端 use client; import { Button,Card, Space,Tag,Table,message,Input } from antd; import { useEffect,useState } from react; impor…...

HTML版英语学习系统
HTML版英语学习系统 这是一个完全免费、无需安装、功能完整的英语学习工具,使用HTML CSS JavaScript实现。 功能 文本朗读练习 - 输入英文文章,系统朗读帮助练习听力和发音,适合跟读练习,模仿学习;实时词典查询 - 双…...
Linux信号保存与处理机制详解
Linux信号的保存与处理涉及多个关键机制,以下是详细的总结: 1. 信号的保存 进程描述符(task_struct):每个进程的PCB中包含信号相关信息。 pending信号集:记录已到达但未处理的信号(未决信号&a…...