Linux——命名管道

devtools/2024/11/13 5:33:09/

管道特点

  • 只能用于具有具体祖先的进程之间的通信,通常,一个管道由一个进程创建,然后该进程调用fork,创建子进程,关闭相应的读写端,然后父子进程就可以通信了
  • 管道提供流式服务
  • 一般而言,进程退出,管道释放,所以管道的声明周期随进程
  • 一般而言,内核会对管道操作进行同步和互斥

在这里插入图片描述

创建命名管道

mkfifo :第一个参数是命名管道的路劲名,第二个参数是权限,mode_t 其实是对unsigned int 的封装
返回值:成功返回0,失败返回-1,错误码被设置
在这里插入图片描述

在这里插入图片描述

文件分类

  • -:普通文件
  • d:目录文件
  • b:块设备文件
  • c:字符文件
  • p:管道文件,上述图中所示
  • s:网络(socket)文件
  • l:链接文件

这时有一个问题,就是如何进行通信的。通信的前提就是看到同一份资源,只有看到同一份资源,才能进行通信。
而mkfifo一个库函数,就是通过第一个参数看到同一份资源的,我们都知道,每一个进程都有属于自己的PCB结构体,其中有一个指针指向了文件描述符表,文件描述符表的内容又指向了file结构体,其中file结构体中存放着文件的inode,属性信息等等

当另一个进程创建的时候,去访问同一份资源,最后的访问的文件内容其实只有一份,进程最后一访问的就是同一块缓冲区。

如保证两个不同的进程打开的是同一个文件??

linux文件路径 + 文件名就可以保证打开的是同一个文件
在这里插入图片描述

在这里插入图片描述

实验:

管道是具有同步和互斥的,当我们读取一个管道文件的时候,如果没有文件就会被阻塞住,当有文件就会被读出来
在这里插入图片描述

这里我用客户端和服务端来实验, 当我们的服务端受到了客户端发来的消息,它会去读取,通过调用read函数,其中同步由read系统调用函数来解决。
在这里插入图片描述

ssize_t read(int fd,void buf,size_t count)*
功能:将fd指向的文件中的count个传送到buf中
如果返回0,表示已经到文件末尾或是无可读取的数据。如果返回-1,代表读取不成功,错误码存入errno中。
fd:文件描述符
buf:所要读的内容
count:要读取的大小

客户端打开管道文件是通过open系统调用函数,open函数中,flags可以是O_RDONLY、O_WRONLY、O_NONBLOCK,但是不能是O_RDWR,因为管道是单向的
在这里插入图片描述
成功打开则返回文件描述符,失败返回-1
其中flags 是以什么方式打开。
O_RDONLY 只读方式
O_WDONLY只写方式
O_RDWR读写方式
O_APPEND在文件的末尾上追加
O_CREAT如果文件不存在就创建
mode是权限

server.cc

#include "comm.hpp"
#include "log.hpp"
#include <sys/wait.h>//这是从fd中拿到数据的函数
static void getMessage(int fd)
{char buffer[SIZE];while (true){memset(buffer, '\0', sizeof(buffer));// 这里sizeof-1  是因为系统接口,文件有自己的管理机制,OS不用去关心\0ssize_t s = read(fd, buffer, sizeof(buffer) - 1);if (s > 0){cout <<"[" << "pid:" << getpid() << "]" << " " << "client say:"<< " " << buffer << endl;}else if (s == 0){cout << "[" << "pid:" << getpid() << "]"  << " "<< "read end of file, client quit,server quit too" << endl;break;}else{// read failbreak;}}
}int main()
{//1.创建管道文件if(mkfifo(ipcPath.c_str(),MODE) < 0){perror("mkfifo fail");exit(1);}log("创建管道成功",Debug) << " | " <<  "Step 1" << endl;//2.正常的文件操作int fd = open(ipcPath.c_str(),O_RDONLY);if(fd < 0){perror("open");exit(2);}log("打开管道成功",Debug)<< " | " << "Step 2" << endl;int nums = 5; for(int i =0; i<nums; i++){pid_t id = fork();if(id == 0){//3.编写正常代码//child//从fd中拿到数据getMessage(fd);exit(1);}}for(int i =0; i<nums; i++){//阻塞式等待waitpid(-1,nullptr,0);}//4.关闭文件close(fd);log("关闭管道成功",Debug)<< " | " << "Step 3" << endl;//通信结束,关闭管道文件unlink(ipcPath.c_str());log("删除管道成功",Debug) << " | "<< "Step 4" << endl;return 0;
}

client.cc

#include "comm.hpp"
#include "log.hpp"int main()
{//1.获取管道文件int fd = open(ipcPath.c_str(),O_WRONLY);if(fd < 0) {perror("open");exit(1);}// 2.ipc过程string buffer;while(true){cout << "Please Enter Message Line ->";getline(cin,buffer);//向文件里面去写write(fd,buffer.c_str(),buffer.size());}//3.关闭文件close(fd);return 0;
}

实验结果:

在这里插入图片描述
最后的退出结果
在这里插入图片描述


http://www.ppmy.cn/devtools/31174.html

相关文章

MySQL商城数据库88张表结构(46—50)

46、消息队列表 CREATE TABLE dingchengyu消息队列表 (id int(11) NOT NULL AUTO_INCREMENT COMMENT 序号,userId int(11) DEFAULT NULL COMMENT 用户id,msgTtype tinyint(4) DEFAULT 0 COMMENT 消息类型,createTime datetime DEFAULT NULL COMMENT 创建时间,sendTime datetim…

全面学习SpringCloud框架指南

要深入学习Spring Cloud框架&#xff0c;你需要系统地掌握其核心组件和概念&#xff0c;并了解如何在实际项目中应用这些知识。以下是一些关键的学习点和相应的学习内容&#xff1a; 一共分为10个模块包括&#xff1a; 1、微服务架构基础&#xff1a; 理解微服务架构的概念和…

Delphi10和12的FDConnection1.GetTableNames参数不一样了

FDConnection1连接excel文件&#xff0c;获取工作表的名字&#xff0c;10的时候一切正常&#xff0c; Delphi10&#xff1a; FDConnection1.GetTableNames(, , , ss, [osSystem], [tkTable], false); 换成Delphi12.1后&#xff0c;无论如何都不能显示工作表名&#xff0c;尝…

MYSQL从入门到精通(一)

1、概述 【1】使用率最高 2、数据库的重要性 【1】数组、集合、文件 【2】数据管理系统-MySQL 【3】持久化数据&#xff0c;容易管理、查询 3、相关概念 【1】DB database 数据库 【2】DBMS 数据库管理系统&#xff08;MySQL就是其中一种&#xff09; 【3】SQL 结构查询语…

[1702]java旅游资源网上填报系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java旅游资源网上填报系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql…

Multi-Thread TCP Server Client

prerequisite knowledge: Basic TCP Server & Client: URL Server #include <stdio.h> #include <string.h> #include <unistd.h> // read and write (TCP); sendto and recvfrom (UDP) #include <arpa/inet.h> // 包含#include <sys/socket.…

大数据架构

某网广告平台展示的数据指标包含两类&#xff1a;曝光类&#xff08;包括曝光数、点击数、点击单价、花费&#xff09;&#xff0c;转化类&#xff08;包括转化下单数、转化下单金额、转化付款数、转化付款金额&#xff09;。前一类的数据主要由流量方以接口的方式提供&#xf…

【bbs02补】注册功能form组件-前端-后端-总结、登录功能(前端、后端、生成验证码)

1 注册功能 1.1 注册功能form组件 1.2 注册功能前端 1.3 注册功能后端 1.4 forms组件和前后端总结 2 登录功能 2.1 登录前端 2.2 生成验证码 1 注册功能 1.1 注册功能form组件 # 注册页面-用户名-密码-确认密码-邮箱-手机号-头像# form组件 可以帮助我们1 快速生成前端页面2 数…