【Linux】命名管道的创建方法&&基于命名管道的两个进程通信的实现

简介: 【Linux】命名管道的创建方法&&基于命名管道的两个进程通信的实现

一、匿名管道和命名管道的区别

  • 匿名管道由pipe函数创建并打开。
  • 命名管道由mkfifo函数创建,打开用open
  • FIFO(命名管道)与pipe(匿名管道)之间唯一的区别在它们创建与打开的方式不同,一但这些工作完成之后,它们具有相同的语义。

一、创建命名管道的函数

 #include <sys/stat.h>
 // 返回值:成功返回0,出错返回-1
 int mkfifo(const char *pathname, mode_t mode);

pathname指创建出来的管道的路径和管道名,mode指创建出来的管道的权限,这里的权限和文件的权限是一样的。

二、删除命名管道的函数

 #include <unistd.h>
 // 返回值:成功返回0,出错返回-1
 int unlink(const char *pathname);

pathname指创建出来的管道的路径和管道名,unlink也可以用来删除一般的文件。

三、利用命名管道实现两个进程之间的简单通信

这个通信将实现写端发送信息读端接收信息。更多地实现细节会在代码中以注释的方式给出。

3.1、头文件

#include <iostream>
#include <cstring>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <cstdio>
 
using namespace std;
 
#define MODE 0666 //权限
#define NAME "./fifo.txt"
 
//定义命名管道结构体
class Fifo
{
private:
    string _name; // 文件路径加文件名
public:
    Fifo(const string &name)
        : _name(name)
    {
        int n = mkfifo(_name.c_str(), MODE);
 
        if (n == 0)
            cout << "创建管道成功!" << endl;
        else
            cout << "创建管道失败!原因是:" << strerror(errno) << endl;
    };
    ~Fifo()
    {
        int n = unlink(_name.c_str());
 
        if (n == 0)
            cout << "删除管道成功!" << endl;
        else
            cout << "删除管道失败!原因是:" << strerror(errno) << endl;
    };
};

3.2、接收方(Server)

#include "namedPipe.hpp"
 
int main()
{
 
    Fifo fifo(NAME);
    //打开文件,打开成功返回文件描述符,打开失败返回-1
    int rfd = open(NAME, O_RDONLY);
    if (rfd < 0)
    {
        cout << "文件打开失败,原因是:" << strerror(errno) << endl;
        return 1;
    }
    cout << "文件打开成功!" << endl;
 
    while (true)
    {
        char buffer[1024];
        //读端不退,read函数会一直阻塞等待,读端退出read读到0
        ssize_t n = read(rfd, buffer, sizeof(buffer) - 1);
 
        if (n > 0)
        {
            buffer[n] = '\0';
            cout << "客户说:" << buffer << endl;
        }
        else if (n == 0)
        {
            cout << "客户退出了,我也退出了";
            break;
        }
        else
        {
            cout << "读取出错!原因是:" << strerror(errno) << endl;
            break;
        }
    }
 
    close(rfd);
    return 0;
}

3.3、发送方(Client)

#include "namedPipe.hpp"
 
int main()
{
    int wfd = open(NAME, O_WRONLY);
    
    if (wfd < 0)
    {
        cout << "文件打开失败,原因是:" << strerror(errno) << endl;
        return 1;
    }
    cout << "文件打开成功!" << endl;
 
    string buffer;
    while(true)
    {
        cout << "请输入你的信息:" << endl;
        getline(cin, buffer);
        if(buffer == "quit")
        break;
 
        int n = write(wfd, buffer.c_str(), sizeof(buffer)-1);
        
        if(n < 0)
        {
            cout << "输入错误,错误原因是:" << strerror(errno) << endl;
        }
 
    }
 
    close(wfd);
    return 0;
}
相关文章
|
9月前
|
Ubuntu 物联网 Linux
从零安装一个Linux操作系统几种方法,以Ubuntu18.04为例
一切就绪后,我们就可以安装操作系统了。当系统通过优盘引导起来之后,我们就可以看到跟虚拟机中一样的安装向导了。之后,大家按照虚拟机中的顺序安装即可。 好了,今天主要介绍了Ubuntu Server版操作系统的安装过程,关于如何使用该操作系统,及操作系统更深层的原理,还请关注本号及相关圈子。
|
9月前
|
缓存 监控 Linux
Linux系统清理缓存(buff/cache)的有效方法。
总结而言,在大多数情形下你不必担心Linux中buffer与cache占用过多内存在影响到其他程序运行;因为当程序请求更多内存在没有足够可用资源时,Linux会自行调整其占有量。只有当你明确知道当前环境与需求并希望立即回收这部分资源给即将运行重负载任务之前才考虑上述方法去主动干预。
2347 10
|
9月前
|
Ubuntu Linux 图形学
推广与体验Ubuntu Linux的便捷方法
如果你的朋友或家人对尝试Linux感兴趣,但希望在安装之前先体验一下,你可以分享以下链接给他们:Ubuntu在线导览。通过这个链接,他们可以在任何地方轻松体验Ubuntu,无需安装即可深入了解这个流行的操作系统。
|
9月前
|
XML 缓存 Linux
在Linux环境下解决Visual Studio Code字体显示异常和字体替换方法。
解决Linux下VS Code字体显示异常,需要对Linux字体渲染机制有所理解,并对VS Code的配置选项进行合理设置。替换字体时则要通过系统字体配置或VS Code设置来完成。通过上述方法,可以有效地解决字体显示问题,从而提升代码编辑的视觉体验。
1363 0
|
12月前
|
NoSQL Linux 编译器
GDB符号表概念和在Linux下获取符号表的方法
通过掌握这些关于GDB符号表的知识,你可以更好地管理和理解你的程序,希望这些知识可以帮助你更有效地进行调试工作。
515 16
|
10月前
|
网络协议 Ubuntu Linux
Wireguard in Linux的安装方法
本文介绍了如何在Ubuntu和Rocky Linux中安装配置WireGuard,并探讨了配置过程中可能出现的DNS泄露问题及解决方法,包括通过nmtui设置DNS及调整DNS优先级参数。
|
Linux Shell
Linux系统下快速批量创建和删除文件的方法
总的来说,使用shell脚本来批量处理文件是一种非常强大的工具,只要你愿意花时间学习和实践,你会发现它能大大提高你的工作效率。
669 19
|
Ubuntu Linux 网络安全
如何在Linux中更改主机名?修改主机名最新方法
本期教程将指导您如何在Linux系统中更改主机名。主机名是Linux系统的常用功能,用于识别服务器,帮助区分不同服务器,并与网络进程和其他应用程序协同工作。教程涵盖显示当前主机名的方法(通过`hostname`命令),以及在CentOS 7、Debian 9和Ubuntu 16.04及以上版本中更改主机名的步骤(使用`hostnamectl set-hostname`命令)。对于其他Linux版本,可编辑`/etc/hostname`文件实现更改。记得重启相关服务或服务器以使更改生效!
2894 12
|
安全 Linux 网络安全
在Linux(CentOS和AWS)上安装更新的git2的方法并配置github-ssh
经过以上这些步骤,你现在就能在GitHub上顺利往返,如同海洋中的航海者自由驰骋。欢迎你加入码农的世界,享受这编程的乐趣吧!
538 10