当前位置: 首页 > news >正文

网站建设注意优秀网页设计

网站建设注意,优秀网页设计,东北亚科技园里有做网站的吗,做网站 然后百度推广文章目录 命名管道什么是命名管道**命名管道 vs. 无名管道**如何创建命名管道 用命名管道实现进程间通信MakefileComm.hppServer.hppClient.hppServer.cppClient.cpp 效果总结 命名管道 什么是命名管道 命名管道,也称为 FIFO(First In First Out&#…

请添加图片描述

文章目录

  • 命名管道
    • 什么是命名管道
    • **命名管道 vs. 无名管道**
    • 如何创建命名管道
  • 用命名管道实现进程间通信
    • Makefile
    • Comm.hpp
    • Server.hpp
    • Client.hpp
    • Server.cpp
    • Client.cpp
  • 效果
  • 总结

命名管道

什么是命名管道

命名管道,也称为 FIFO(First In First Out),是一种 进程间通信(IPC) 机制,它允许不相关的进程(即没有父子关系的进程)通过文件系统中的特殊文件进行数据传输。


命名管道 vs. 无名管道

类型说明适用场景
匿名管道pipe() 创建,仅限于父子进程之间通信适用于父进程创建子进程并通信
命名管道mkfifo() 创建,存在于文件系统中,可用于任意进程间通信适用于独立进程间通信

如何创建命名管道

在这里插入图片描述
手动创建命名管道:

mkfifo FIFO

在这里插入图片描述
这个FIFO也是一个文件,被操作系统特殊标记过,是管道文件。
在C语言库中有一个函数也是mkfifo,这个接口解决了进程间通信的问题。
在这里插入图片描述

用命名管道实现进程间通信

在这里插入图片描述

我们创建一下文件,Client是模拟的客户端用于发送请求,server是服务端,用于接收请求,Comm用于存储全局变量,还有一些都要用到的函数,Makefile用来编译可执行程序,首先我们将Makefile完善。

Makefile

SERVER=server 
CLIENT=client 
cc=g++
SERVER_SRC=Server.cc
CLIENT_SRC=Client.cc.PHONY:all
all:$(SERVER) $(CLIENT)$(SERVER):$(SERVER_SRC)$(cc) -o $@ $^ -std=c++11
$(CLIENT):$(CLIENT_SRC)$(cc) -o $@ $^ -std=c++11.PHONY:clean
clean:rm -f $(SERVER) $(CLIENT)

由于在Makefile中只能创建一个可执行文件,所以我们需要加上这一段:在这里插入图片描述

这一段表示all,这个伪目标依赖下面两个可执行程序,所以不得不创建下面两个可执行程序来完成这个伪目标了。

Comm.hpp

#pragma once#include <iostream>
#include <string>
#include <unistd.h>
#include <thread>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
using namespace std;//双方通信使用的文件
const string gpipefile = "./fifo";
const mode_t gmode = 0600;//允许拥有者写,所属组和other什么权限都没有
const int gdefulted = -1;
const int gsize = 1024;
const int gForRead = O_RDONLY;
const int gForWrite = O_WRONLY;//打开管道
int OpenPipe(int flag)
{//以只读方式打开int fd = open(gpipefile.c_str(),flag);if(fd < 0){cerr<<"open error"<<endl;return false;}return fd;
}
void ClosePipeHelper(int fd)
{if(fd >= 0) close(fd);
}

由于客户端和服务器都要打开管道和关闭管道,所以我们将这两个接口放在Comm中,但是因为这两个端的打开方式不一样,所以我们用一个参数来代替,调用这个函数的时候只需要传递调用的方式就行了。

Server.hpp

#pragma once
#include "Comm.hpp"class Init
{
public://创建文件Init(){umask(0);//先将缺省权限清零int n = mkfifo(gpipefile.c_str(),gmode);if(n < 0)//创建管道文件失败{cerr<<"mkfifo error"<<endl;return;}cout<<"mkfifo success"<<endl;}//销毁文件~Init(){//删除当前路径下的文件int n = unlink(gpipefile.c_str());//判断是否删除成功if(n < 0){cerr<<"unlink error"<<endl;return;}cout<<"unlink success"<<endl;}
};Init init;class Server
{
public://初始化Server():_fd(gdefulted){}bool OpenPipeForRead(){_fd = OpenPipe(gForRead);if(_fd < 0)return false;return true;}//读取管道//string *out:输出型参数//const string &输入型参数//string &输入输出型参数 int RecvPipe(string *out){char buffer[gsize];//读取文件ssize_t n = read(_fd,buffer,sizeof(buffer)-1);//预留一个空间,后面是期望读这么多,n是实际读取的字节数if(n > 0)//读取成功{buffer[n]=0;//读取成功将buffer带出去*out = buffer;}//返回read实际的字节数return n;}void ClosePipe(){ClosePipeHelper(_fd);}~Server(){}
private:int _fd;
};

首先是创建管道文件,我们封装一个类,用于管理管道文件的创建和销毁,声明一个全局变量,构造函数用于创建管道,析构函数用于销毁管道,由于全局变量的生命周期是和程序一样的,所以当程序结束的时候管道文件也跟着销毁,也意味着通信结束。


Server是客户端用于接收请求,意思是我们要将Client发送的信息输出到屏幕上。
在这里插入图片描述
这个函数就是用于读取管道内部客户端发送的请求。

Client.hpp

#pragma once
#include "Comm.hpp"//看到同一份资源class Client
{
public://初始化Client():_fd(gdefulted){}//打开管道bool OpenpipeForWrite(){_fd = OpenPipe(gForWrite);if(_fd < 0) return false;return true;}//发送管道int SendPipe(const string& in){return write(_fd,in.c_str(),sizeof(in));}//关闭管道void ClosePipe(){ClosePipeHelper(_fd);}~Client(){}
private:int _fd;
};

Client唯一和Server不一样的就是一个是读取,一个是发送,而Client就是发送,向服务器发送信息。
在这里插入图片描述
所以这里直接向管道中写即可。

string *out:输出型参数 | const string &输入型参数 | string &输入输出型参数
上面是每个参数的意义

Server.cpp

#include "Server.hpp"int main()
{Server server;server.OpenPipeForRead();string message;while(true){if(server.RecvPipe(&message) > 0){cout<<"client Say#"<<message<<endl;}else break;}cout<<"client quit,me too"<<endl;server.ClosePipe();return 0;
}

Client.cpp

#include "Client.hpp"int main()
{Client client;client.OpenpipeForWrite();string message;while(true){cout<<"please Enter#";getline(cin,message);client.SendPipe(message);//这里的message从标准输入来}client.ClosePipe();return 0;
}

效果

在这里插入图片描述

当客户端关闭时服务器也会跟着关闭
在这里插入图片描述

总结

命名管道(FIFO)作为 Linux 进程间通信(IPC)的一种机制,提供了一种基于文件系统的数据传输方式,使得不相关进程之间也能进行数据交换。相比于无名管道,它具有更高的灵活性,不需要父子进程关系,适用于生产者-消费者模式日志收集进程调试等场景。

通过 mkfifo 创建命名管道,我们可以实现进程间的数据流动,而不必使用共享内存或消息队列等复杂机制。命名管道不仅支持流式数据传输,还能够跨终端、跨进程进行数据交互,极大简化了进程间通信的实现。

总结来说,命名管道是一种简单、高效、灵活的 IPC 机制,适用于轻量级的数据传输需求,在系统编程和日常应用中都有着广泛的应用。

通过实践,我们也看到了命名管道的易用性与强大功能,它使得开发者能够更加高效地实现进程间的数据交换,促进了软件系统的模块化与解耦。

http://www.khdw.cn/news/24555.html

相关文章:

  • 淘宝客网站怎样做seo公众号seo排名软件
  • 学做网站看书会了吗vivo应用商店
  • 做图赚钱的网站有哪些品牌网络营销策划书
  • 灵宝超市建设管理局信访网站明天上海封控16个区
  • 网站空间服务器必应搜索引擎网站
  • wordpress安装网站源码独立站seo是什么意思
  • 什么网站可以做电影投资百度广告联盟官网
  • 用微信微博网站来做睡眠经济指数基金
  • 网站做APP麻烦吗如何制作一个属于自己的网站
  • 无限动力营销型网站建设谷歌推广怎么样
  • 建设网站网站设计全球搜索引擎网站
  • 北京疫情为什么突然又严重了淘宝关键词优化
  • 新网站如何做百度收录百度指数批量
  • 西乡移动网站建设网络推广公司是干什么
  • 做网页去哪些网站找素材较好宁波seo优化外包公司
  • 上海市官方网站免费网站模板
  • 百度地图疫情实时动态优化什么建立生育支持政策体系
  • 做算命网站犯法吗seo的优点有哪些
  • 怎么搭建自己的网站卖货百度一下官方网址
  • 瀑布流网站模板手机系统优化软件
  • 网站建设商家网络营销前景和现状分析
  • 网站导出链接查询重庆森林百度云
  • WordPress网站被恶意登录上海网络推广平台
  • 网站集约建设报告2024年3月新冠高峰
  • 户外网站做百度推广费用可以退吗
  • wordpress插件 stock南昌seo外包公司
  • 贵阳有做网站的公司吗百度首页排名代发
  • 深圳建模板网站谷歌sem和seo区别
  • 手机搭建本地网站软件外包
  • 沈阳网站前端百度电话号码