当前位置: 首页 > 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;帮助…...

lsof 命令

lsof&#xff08;list open files&#xff09;是一个列出当前系统打开文件的工具。在linux环境下&#xff0c;任何事物都以文件的形式存在&#xff0c;通过文件不仅仅可以访问常规数据&#xff0c;还可以访问网络连接和硬件。所以如传输控制协议 (TCP) 和用户数据报协议 (UDP) …...

F5G城市光网,助力“一网通城”筑基数字中国

《淮南子》中说&#xff0c;“临河而羡鱼&#xff0c;不如归家织网”。 这句话在后世比喻为做任何事情都需要提前做好准备&#xff0c;有了合适的工具&#xff0c;牢固的基础&#xff0c;各种难题也会迎刃而解。 如今&#xff0c;数字中国发展建设如火如荼&#xff0c;各项任务…...

Ownips+Coze海外社媒数据分析实战指南

目录 一、引言二、ISP代理简介三、应用实践——基于Ownips和coze的社媒智能分析助手3.1、Twitter趋势数据采集3.1.1、Twitter趋势数据接口分析3.1.2、Ownips原生住宅ISP选取与配置3.1.3、数据采集 3.2、基于Ownips和Coze的社媒智能助手3.2.1、Ownips数据采集插件集成3.2.2、创建…...

C#操作MySQL从入门到精通(10)——对查询数据进行通配符过滤

前言 我们有时候需要查询数据,并且这个数据包含某个字符串,这时候我们再使用where就无法实现了,所以mysql中提供了一种模糊查询机制,通过Like关键字来实现,下面进行详细介绍: 本次查询的表中数据如下: 1、使用(%)通配符 %通配符的作用是,表示任意字符出现任意次数…...

厘米级精确定位,开启定位技术新时代

定位技术在当前这个科技发展时代可以说是以以前所未有的速度在发展&#xff0c;其中厘米级精确定位技术更是成为当前的研究热点和实际应用中的佼佼者。这项技术以其高度的精准性和广泛的应用前景&#xff0c;正在逐渐改变我们的生活和工作方式。接下来我们跟着深圳沧穹科技一起…...

docker 存储 网络 命令

文章目录 1 docker存储1.1 目录挂载2.1卷映射2.1.1卷映射和目录挂载的区别2.1.2卷映射的使用 2 docker网络2.1查看docker的默认网络2.2查看容器的IP2.3容器互通2.4自定义网络2.4.1 创建自定义网络2.4.2创建容器的时候加入到自定义的网络2.4.3使用域名进行容器之间的访问2.4.4re…...

【MATLAB源码-第222期】基于matlab的改进蚁群算法三维栅格地图路径规划,加入精英蚁群策略。包括起点终点,障碍物,着火点,楼梯。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 蚁群算法&#xff08;Ant Colony Optimization&#xff0c;ACO&#xff09;是一种通过模拟蚂蚁觅食行为的启发式优化算法。它由意大利学者Marco Dorigo在20世纪90年代初提出&#xff0c;最初用于解决旅行商问题&#xff08;T…...

百度ERNIE系列预训练语言模型浅析(4)-总结篇

总结&#xff1a;ERNIE 3.0与ERNIE 2.0比较 &#xff08;1&#xff09;相同点&#xff1a; 采用连续学习 采用了多个语义层级的预训练任务 &#xff08;2&#xff09;不同点&#xff1a; ERNIE 3.0 Transformer-XL Encoder(自回归自编码), ERNIE 2.0 Transformer Encode…...

Ubuntu 20.04 LTS配置JDK、Git

一、配置JDK 1.1 更新系统 执行以下命令 sudo apt update 出现以下界面即为安装成功 1.2 安装openjdk-11-jdk Ubuntu20.04中没有默认JDK&#xff0c;执行以下指令安装&#xff0c;默认会自动配置一些必要环境变量 sudo apt install openjdk-11-jdk 1.3 配置环境变量&…...

外汇天眼:Marqeta加速欧洲业务发展,华沙办公室正式开幕

Marqeta&#xff0c;全球现代卡发行平台&#xff0c;今天宣布在波兰华沙设立新办公室&#xff0c;以支持其长期的业务和增长战略。通过在波兰设立业务&#xff0c;Marqeta直接获得了进入欧盟的通道&#xff0c;为其在跨境增长和提供增强服务奠定了良好基础。波兰作为欧洲中心位…...

如何做收费视频互动网站/怎么快速推广自己的产品

任何平台都有一套规则&#xff0c;抖音也不例外&#xff0c;那么想玩好抖音&#xff0c;那么利用规则去做就是最好的办法。那么佛山抖音老师教几个实用技巧吧&#xff01; 技巧一、调整发布时间 有统计显示&#xff0c;有62%的用户&#xff0c;会在饭前和睡前刷抖音&#xff0c…...

什么是培训网站建设/新手做外贸怎么入门

2019独角兽企业重金招聘Python工程师标准>>> RMI:远程方法调用(Remote Method Invocation)。能够让在某个java虚拟机上的对象像调用本地对象一样调用另一个java 虚拟机中的对象上的方法。 RMI远程调用步骤&#xff1a; 1&#xff0c;客户对象调用客户端辅助对象上的…...

中华人民共和国建设部官方网站/经典模板网站建设

大多数情况下&#xff0c;为了保证对外服务的安全性&#xff0c;我们在服务端实现的为服务接口时往往都会有一定的权限校验机制&#xff0c;比如对用户登录状态的校验等&#xff1b;同时为了防止客户端在发起请求时被篡改等安全方面的考虑&#xff0c;还会有一些签名校验的机制…...

google建站/人工智能培训机构排名

0. 传送门 论文地址&#xff1a;https://arxiv.org/abs/2003.12929 github地址&#xff1a;https://github.com/fuy34/superpixel_fcn 1. 简介 超像素最直观的解释&#xff0c;就是把一些具有相似特性的像素“聚合”起来&#xff0c;形成一个更具有代表性的大“元素”。 目…...

乐清网站设计制作/网站百度不收录

IOS7 webview全屏导致状态栏悬浮在页面上解决方案&#xff1a;打开 ios项目/classes/MainViewController.m&#xff0c;修改viewWillAppear方法- (void)viewWillAppear:(BOOL)animated{// View defaults to full size. If you want to customize the views size, or its subvie…...

电商系统源码公司哪家好/郑州seo教程

这篇教程教Coreldraw爱好者们用Coreldraw绘制可爱卡通杯子&#xff0c;本教程主要用到贝塞尔工具和交互式填充工具。我们一起先看下完成图吧&#xff1a; 具体的制作步骤如下&#xff1a; 1、画杯身。 用矩形工具画出如下矩形&#xff0c;用形状工具选中&#xff0c;ctrlQ转换为…...