《Linux C编程实战》笔记:有名管道

管道的一个问题就是没有名字,因此只能用于有亲缘关系的进程间通信。

有名管道(named pipe或FIFO)它提供一个路径名与之关联,以FIFO的文件形式存储于文件系统中。有名管道是一个设备文件,因此,即使进程与创建FIFO的进程不存在亲缘关系,只要可以访问该路径,就能够通过FIFO相互通信。FIFO总是按照先进先出的原则工作。

有名管道的创建与读写

Linux下有两种方法创建有名管道。一是在Shell下交互地建立一个有名管道。Shell下可使用mknod或mkfifo命令,比如:

mknod namedpipe

或者是在程序里用函数。

#include<sys/types.h>
#include<sys/stat.h>
int mknod(const char *path,mode_t mod,dev_t dev);
int mkfifo(const char *path,mode_t mode);

参数中path为创建的有名管道的全路径名:mod为创建的有名管道的模式,指明其存取权限,和creat函数的参数是一个意思。dev为设备值,该值取决于文件创建的种类,它只在创建设备文件时才会用到。这两个函数成功调用都返回0,失败都返回-1

umask(0);
if(mknod("tmp/fifo",S_IFIFO|0666,0)==-1){perror("mknod error!");exit(1);
}

S_FIFO|0666 指明创建了一个有名管道且存取权限为0666,即创建者,与创建者同组的,其他用户对该有名管道的访问权限都是可读可写,这方面在文件读写章节有介绍

有名管道创建后就可以使用了,有名管道和管道的使用方法基本是相同的。只是使用有名管道时,必须先调用open打开。因为有名管道是存在于硬盘上的文件,而管道是存在于内存中的特殊文件。

需要注意的事,调用open打开有名管道的进程可能会被阻塞。但如果同时用读写方式O_RDWR打开,则一定不会导致阻塞;如果以只读方式O_RDONLY打开,则调用open函数的进程将会被阻塞直到有写方式打开管道;同样以只写方式O_WRONLY打开也会阻塞直到有读方式打开管道。

示例程序1

演示有名管道在无亲缘关系的进程如何进行通信。示例包含两个程序

//procread程序
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
#include<fcntl.h>
#define FIFO_NAME "myfifo"
#define BUF_SIZE 1024
int main(int argc,char **argv,char **environ){int fd;char buf[BUF_SIZE];umask(0);fd=open(FIFO_NAME,O_RDONLY);read(fd,buf,BUF_SIZE);close(fd);exit(0);
}

这个代码就是很简单的文件读取,没什么好说的。

然后是写的程序,在这里创建了有名管道

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
#include<fcntl.h>
#define FIFO_NAME "myfifo"
#define BUF_SIZE 1024
int main(int argc,char **argv,char **environ){int fd;char buf[BUF_SIZE]="Hello procwrite,I come from process named procread!";umask(0);if(mkfifo(FIFO_NAME,S_IFIFO|0666)==-1){perror("mkfifo error!");exit(1);}if((fd=open(FIFO_NAME,O_WRONLY))==-1){perror("fopen error!");exit(0);}write(fd,buf,strlen(buf)+1);close(fd);exit(0);
}

先运行write进程,运行后处于阻塞状态,因为要等另一个进程以写方式打开有名管道,然后再另一个终端运行read,结果如下:

同时也有一个myfifo的文件。 

有名管道的应用实例

这回也同样创建两个FIFO来实现不同进程的全双工通信。下面的程序演示两个进程间的聊天程序。一个为server端,一个为client端。

server端:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
#include<errno.h>
#include<fcntl.h>
#define FIFO_READ "readfifo"
#define FIFO_WRITE "writefifo"
#define BUF_SIZE 1024
int main(int argc,char **argv,char **environ){int wfd,rfd;//读写的管道char buf[BUF_SIZE];int len;umask(0);if(mkfifo(FIFO_WRITE,S_IFIFO|0666)){//服务器程序创建写管道printf("can't create fifo %s because %s",FIFO_WRITE,strerror(errno));exit(1);}umask(0);wfd=open(FIFO_WRITE,O_WRONLY);//服务器程序以写方式打开写管道if(wfd==-1){printf("open fifo %s error:%s",FIFO_WRITE,strerror(errno));exit(1);}while((rfd=open(FIFO_READ,O_RDONLY))==-1){//这是一个循环,当客户端程序创建读管道时才继续下去sleep(1);}while (1){printf("Server:");fgets(buf,BUF_SIZE,stdin);//从标准输入(也就是终端)读入字符串buf[strlen(buf)-1]='\0';//从标准输入读的字符串最后会有\n,把它改成\0if(strncmp(buf,"quit",4)==0){//如果是quit,就结束进程close(wfd);unlink(FIFO_WRITE);//unlink在文件删除这个文章介绍过close(rfd);exit(0);}write(wfd,buf,strlen(buf));//写len=read(rfd,buf,BUFSIZ);//读if(len>0){buf[len]='\0';printf("Client:%s\n",buf);}}}

client端:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
#include<errno.h>
#include<fcntl.h>
//注意这里的fifo_write和fifo_read和服务器程序不一样,其他就几乎没啥区别了
#define FIFO_WRITE "readfifo"
#define FIFO_READ "writefifo"
#define BUF_SIZE 1024
int main(int argc,char **argv,char **environ){int wfd,rfd;char buf[BUF_SIZE];int len;umask(0);if(mkfifo(FIFO_WRITE,S_IFIFO|0666)){printf("can't create fifo %s because %s",FIFO_WRITE,strerror(errno));exit(1);}while((rfd=open(FIFO_READ,O_RDONLY))==-1){sleep(1);}umask(0);wfd=open(FIFO_WRITE,O_WRONLY);if(wfd==-1){printf("open fifo %s error:%s",FIFO_WRITE,strerror(errno));exit(1);}while (1){len=read(rfd,buf,BUFSIZ-1);if(len>0){buf[len]='\0';printf("Client:%s\n",buf);}printf("Client:");fgets(buf,BUF_SIZE,stdin);buf[strlen(buf)-1]='\0';if(strncmp(buf,"quit",4)==0){close(wfd);unlink(FIFO_WRITE);close(rfd);exit(0);}write(wfd,buf,strlen(buf));}}

分两个终端去运行

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/669196.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用maven对springboot项目进行瘦身

目录 一、什么是Maven 二、springboot 项目 三、springboot 项目瘦身 一、什么是Maven Maven是一个基于Java的项目管理和构建工具。它通过提供一个一致的项目结构、自动化构建脚本和依赖管理系统&#xff0c;简化了Java项目的构建过程。 Maven使用一种称为POM&#xff08;…

华为数通方向HCIP-DataCom H12-821题库(单选题:381-400)

第381题 以下是某台设备通过display isis lsdb命令输出的信息,那么关于以上输出的信息的描述,正确的是哪一项? <R1>display isis lsdbDatabase information for ISIS(1)--------------------------------Level-1 Link State DatabaseLSPID Seq Num…

【Gephi项目实战-带数据集】利用gephi绘制微博肖战超话120位用户关系图,并计算整体网络指标与节点指标

数据集在评论区&#xff0c;B站演示视频在评论区&#xff01; 简介 最近2天需要用到gephi做社会网络分析&#xff0c;于是从0开始接触gephi并摸索出了gephi的基本使用指南。下面将结合真实的节点文件与边文件&#xff0c;利用gephi绘制社会网络并计算相关测量指标。整个过程会…

数据库学习笔记2024/2/5

2. SQL 全称 Structured Query Language&#xff0c;结构化查询语言。操作关系型数据库的编程语言&#xff0c;定义了 一套操作关系型数据库统一标准 2.1 SQL通用语法 在学习具体的SQL语句之前&#xff0c;先来了解一下SQL语言的通用语法。 1). SQL语句可以单行或多行书写&…

扩展鸿蒙ArkUI日期组件

鸿蒙ArkUI日期组件使用的是DatePickerDialog.show基础上扩展的表单式输入组件&#xff0c;方便在输入日期方式快速使用及复用。 /*** 日期*/ Component export default struct DiygwDate{//绑定的值Link Watch(onValue) value:string;// 隐藏值State valueField: string valu…

(5)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—12种聚类算法说明与归纳

目录 一、12种聚类(无监督学习)算法说明和区分比较 聚类算法的类型(一) ​编辑导入函数库 加载数据集 ​编辑 (1)K-Means --Centroid models (2)Mini-Batch K-Means -- Centroid models (3)AffinityPropagation (Hierarchical) -- Connectivity models (4)Mean Shift…

DBNet详解及训练ICDAR2015数据集

论文地址&#xff1a;https://arxiv.org/pdf/1911.08947.pdf 开源代码pytorch版本&#xff1a;GitHub - WenmuZhou/DBNet.pytorch: A pytorch re-implementation of Real-time Scene Text Detection with Differentiable Binarization 前言 在这篇论文之前&#xff0c;文字检…

微信小程序的图片色彩分析,窃取网络图片的主色调

1、安装 Mini App Color Thief 包 包括下载包&#xff0c;简单使用都有&#xff0c;之前写了&#xff0c;这里就不写了 网址&#xff1a;微信小程序的图片色彩分析&#xff0c;窃取主色调&#xff0c;调色板-CSDN博客 2、 问题和解决方案 问题&#xff1a;由于我们的窃取图片的…

基于Langchain-Chatchat + chatGLM3 轻松在本地部署一个知识库

前面三篇分别讲解了如何在本地环境部署大模型&#xff0c;那么今天简单的通过 Langchain-Chatchat 和 chatGLM3结合在本地环境搭建一套属于自己的大模型知识库。 往期llm系列文章 基于MacBook Pro M1芯片运行chatglm2-6b大模型如何在本地部署chatGLM3基于ChatGLM.cpp实现低成…

论文阅读-通过云特征增强的深度学习预测云工作负载转折点

论文名称&#xff1a;Cloud Workload Turning Points Prediction via Cloud Feature-Enhanced Deep Learning 摘要 云工作负载转折点要么是代表工作负载压力的局部峰值点&#xff0c;要么是代表资源浪费的局部谷值点。预测这些关键点对于向系统管理者发出警告、采取预防措施以…

企业动态 | UFAPKU“金融科技”沙龙走进同创永益——前沿技术在金融科技领域的应用

金融科技作为金融发展的驱动力量&#xff0c;对金融行业有着深远的影响。金融行业通过技术创新和数字化转型&#xff0c;极大地提高了金融服务和产品的效率和便捷性。1月21日&#xff0c;UFAPKU“金融科技”第二期沙龙在北大校友企业同创永益北京总部举办&#xff0c;数十位来自…

请问CTF是什么?请介绍一下关于隐水印的知识特点技术原理应用领域技术挑战

目录 请问CTF是什么&#xff1f; 请介绍一下关于隐水印的知识 特点 技术原理 应用领域 技术挑战 请问CTF是什么&#xff1f; CTF&#xff08;Capture The Flag&#xff0c;夺旗比赛&#xff09;是一种信息安全竞赛&#xff0c;常见于计算机安全领域。这种比赛模拟各种信…

fastjson 导致的OOM

fastjson 导致的OOM 示例代码 public static void main(String[] args) throws Exception {try {List<Integer> list JSONObject.parseArray("[2023,2024", Integer.class);}catch (Exception e){System.err.println("error");}System.out.println…

一文搞懂 springboot 如何融合数据源

1、简介 springboot 支持关系型数据库的相关组件进行配置&#xff0c;包括数据源、连接池、事务管理器等的自动配置。降低了数据库使用的难度&#xff0c;除了 mysql 还支持 Derby、H2等嵌入式数据库的自动配置&#xff0c;MongoDB、Redis、elasticsearch等常用的 NoSQL 的数据…

BGP邻居故障检测

第一种情况:如果AR2和AR4采用直连建立邻居,则排查步骤如下: 1)在AR2和AR4上使用ping x.x.x.x命令检查AR2和AR4用于建立EBGP邻居关系的直连地址连通性是否正常。如果不能ping通。则需要使用二分法从网络层向下层逐层进行排查,首先检查接口地址及路由的可达性,修改完成后,如…

Codeforces Round 914 (Div. 2)(D1/D2)--ST表

Codeforces Round 914 (Div. 2)(D1/D2)–ST表 D1. Set To Max (Easy Version) 题意&#xff1a; 给出长度为n的数组a和b&#xff0c;可以对a进行任意次数操作&#xff0c;操作方式为选择任意区间将区间内值全部变成该区间的最大值&#xff0c; 是否有可能使得数组a等于数组b…

C# CAD界面-自定义窗体(三)

运行环境 vs2022 c# cad2016 调试成功 一、引用 二、开发代码进行详细的说明 初始化与获取AutoCAD核心对象&#xff1a; Database db HostApplicationServices.WorkingDatabase;&#xff1a;这行代码获取当前工作中的AutoCAD数据库对象。在AutoCAD中&#xff0c;所有图形数…

《短链接--阿丹》--技术选型与架构分析

整个短链接专栏会持续更新。有兴趣的可以关注一下我的这个专栏。 《短链接--搭建解析》--立项+需求分析文档-CSDN博客 阿丹: 其实整套项目中的重点,根据上面的简单需求分析来看,整体的项目难题有两点。 1、快速的批量生成短链,并找到对应的存储。 并且要保持唯一性质。…

【Linux驱动】块设备驱动(二)—— 块设备读写(使用请求队列)

块设备的操作函数并没有类似于字符驱动中的read 和write函数&#xff0c;要实现读写操作&#xff0c;只能在请求处理函数中实现。这就分为两种&#xff0c;是否要使用请求队列&#xff0c;请求队列的主要作用是管理和调度IO请求。在以下情况中&#xff0c;一般需要用到请求队队…

跑路页面HTML源码

简单的HTMLJSCSS&#xff0c;记事本修改内容&#xff0c;喜欢的朋友可以下载 https://download.csdn.net/download/huayula/88811984