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)是两个备受瞩目的模型。它们各自拥有独特的优势,并在不同的任务中发挥着重要作用。本文将对这两种模型进行详细对比,帮助…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...
腾讯云V3签名
想要接入腾讯云的Api,必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口,但总是卡在签名这一步,最后放弃选择SDK,这次终于自己代码实现。 可能腾讯云翻新了接口文档,现在阅读起来,清晰了很多&…...
基于Springboot+Vue的办公管理系统
角色: 管理员、员工 技术: 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能: 该办公管理系统是一个综合性的企业内部管理平台,旨在提升企业运营效率和员工管理水…...
Caliper 负载(Workload)详细解析
Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...
HTML前端开发:JavaScript 获取元素方法详解
作为前端开发者,高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法,分为两大系列: 一、getElementBy... 系列 传统方法,直接通过 DOM 接口访问,返回动态集合(元素变化会实时更新)。…...
C++--string的模拟实现
一,引言 string的模拟实现是只对string对象中给的主要功能经行模拟实现,其目的是加强对string的底层了解,以便于在以后的学习或者工作中更加熟练的使用string。本文中的代码仅供参考并不唯一。 二,默认成员函数 string主要有三个成员变量,…...
用神经网络读懂你的“心情”:揭秘情绪识别系统背后的AI魔法
用神经网络读懂你的“心情”:揭秘情绪识别系统背后的AI魔法 大家好,我是Echo_Wish。最近刷短视频、看直播,有没有发现,越来越多的应用都开始“懂你”了——它们能感知你的情绪,推荐更合适的内容,甚至帮客服识别用户情绪,提升服务体验。这背后,神经网络在悄悄发力,撑起…...
Linux基础开发工具——vim工具
文章目录 vim工具什么是vimvim的多模式和使用vim的基础模式vim的三种基础模式三种模式的初步了解 常用模式的详细讲解插入模式命令模式模式转化光标的移动文本的编辑 底行模式替换模式视图模式总结 使用vim的小技巧vim的配置(了解) vim工具 本文章仍然是继续讲解Linux系统下的…...
