news 2026/4/18 11:32:08

Linux:命名管道实现IPC(进程间通信七)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Linux:命名管道实现IPC(进程间通信七)

上篇博客我们说过在这篇博客我们将改进我们上篇博客写的,命名管道实现简易通信,下面是改进之后的代码,这里我不详细写出来,希望大家可以凭借上节课的知识以及代码内容,真正的自己理解并且复现一遍~~

Makefile:

.PHONEY : all all : server client server : server.cc g++ server.cc -o server client : client.cc g++ client.cc -o client .PHONEY : clean clean : rm -f client server

server.cc:

#include "common.hpp" int main() { NamedFifo fifo(PATH, FIFO_FILE); FifoOper server(PATH, FIFO_FILE); server.OpenForRead(); server.Read(); server.Close(); return 0; }

client.cc:

#include "common.hpp" int main() { FifoOper client(PATH, FIFO_FILE); client.OpenForWrite(); client.Write(); client.Close(); return 0; }

common.hpp:

#pragma once #include <iostream> #include <string> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #define PATH "." #define FIFO_FILE "fifo" class NamedFifo { public: NamedFifo(std::string path, std::string name) : _path(path) , _name(name) { umask(0); _fifoname = _path + "/" + _name; int n = mkfifo(_fifoname.c_str(), 0666); if (n == -1) { std::cout << "mkfifo fail" << std::endl; } else { std::cout << "mkfifo success" << std::endl; } } ~NamedFifo() { int n = unlink(_fifoname.c_str()); if (n == -1) { std::cout << "~fifo fail" << std::endl; } else { std::cout << "~fifo success" << std::endl; } } private: std::string _path; std::string _name; std::string _fifoname; }; class FifoOper { public: FifoOper(std::string path, std::string name) : _path(path) , _name(name) , _fd(-1) { _fifoname = _path + "/" + _name; } ~FifoOper() { std::cout << "~FifoOper" << std::endl; } void OpenForRead() { _fd = open(_fifoname.c_str(), O_RDONLY); if (_fd < 0) { std::cout << "OpenForRead fail" << std::endl; return; } std::cout << "OpenForRead success" << std::endl; } void OpenForWrite() { _fd = open(_fifoname.c_str(), O_WRONLY); if (_fd < 0) { std::cout << "OpenForWrite fail" << std::endl; return; } std::cout << "OpenForWrite success" << std::endl; } void Read() { char buffer[1024]; while (true) { int number = read(_fd, buffer, sizeof(buffer) - 1); if (number > 0) { buffer[number] = '\0'; std::cout << "client say : " << buffer << std::endl; } else if (number == 0) { std::cout << "client quit! server quit, too!" << std::endl; break; } else { std::cout << "Read error" << std::endl; break; } } } void Write() { std::string message; while (true) { std::cout << "please enter# "; std::getline(std::cin, message); write(_fd, message.c_str(), message.size()); } } void Close() { if (_fd > 0) close(_fd); } private: std::string _path; std::string _name; std::string _fifoname; int _fd; };

这就算有关管道通信的知识啦(命名管道与匿名管道),但是我们的通信之旅还没有完,大家敬请期待后续内容啦~~

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 11:32:07

3分钟搞定跨设备同步:Syncthing-Android零基础指南

3分钟搞定跨设备同步&#xff1a;Syncthing-Android零基础指南 【免费下载链接】syncthing-android Wrapper of syncthing for Android. 项目地址: https://gitcode.com/gh_mirrors/sy/syncthing-android 还在为手机和电脑之间的文件传输烦恼吗&#xff1f;今天我要向你…

作者头像 李华
网站建设 2026/4/18 11:04:17

Windows Auto Dark Mode:让电脑界面随光而变的智能伴侣

Windows Auto Dark Mode&#xff1a;让电脑界面随光而变的智能伴侣 【免费下载链接】Windows-Auto-Night-Mode 项目地址: https://gitcode.com/gh_mirrors/win/Windows-Auto-Night-Mode 你是否曾经在深夜加班时&#xff0c;被刺眼的白色界面晃得睁不开眼&#xff1f;是…

作者头像 李华
网站建设 2026/4/18 8:50:12

Yocto底层构建原理:一文说清BitBake工作机制

Yocto构建的“大脑”与“心脏”&#xff1a;深入理解BitBake如何驱动自动化系统生成你有没有经历过这样的场景&#xff1f;在开发一个嵌入式Linux项目时&#xff0c;为了给设备加上一个小小的命令行工具&#xff0c;却要从零开始下载交叉编译器、配置内核、打补丁、安装依赖库……

作者头像 李华
网站建设 2026/4/18 3:57:35

m3u8下载器终极指南:3步轻松提取在线视频资源

m3u8下载器终极指南&#xff1a;3步轻松提取在线视频资源 【免费下载链接】m3u8-downloader m3u8 视频在线提取工具 流媒体下载 m3u8下载 桌面客户端 windows mac 项目地址: https://gitcode.com/gh_mirrors/m3u8/m3u8-downloader 还在为网页视频无法保存而困扰吗&#…

作者头像 李华
网站建设 2026/4/18 8:02:49

RevokeMsgPatcher微信防撤回终极指南:从此不再错过任何重要对话

RevokeMsgPatcher微信防撤回终极指南&#xff1a;从此不再错过任何重要对话 【免费下载链接】RevokeMsgPatcher :trollface: A hex editor for WeChat/QQ/TIM - PC版微信/QQ/TIM防撤回补丁&#xff08;我已经看到了&#xff0c;撤回也没用了&#xff09; 项目地址: https://g…

作者头像 李华