【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;
}
相关文章
|
3月前
|
消息中间件 存储 网络协议
从零开始掌握进程间通信:管道、信号、消息队列、共享内存大揭秘
本文详细介绍了进程间通信(IPC)的六种主要方式:管道、信号、消息队列、共享内存、信号量和套接字。每种方式都有其特点和适用场景,如管道适用于父子进程间的通信,消息队列能传递结构化数据,共享内存提供高速数据交换,信号量用于同步控制,套接字支持跨网络通信。通过对比和分析,帮助读者理解并选择合适的IPC机制,以提高系统性能和可靠性。
403 14
|
2月前
|
消息中间件 Linux C++
c++ linux通过实现独立进程之间的通信和传递字符串 demo
的进程间通信机制,适用于父子进程之间的数据传输。希望本文能帮助您更好地理解和应用Linux管道,提升开发效率。 在实际开发中,除了管道,还可以根据具体需求选择消息队列、共享内存、套接字等其他进程间通信方
79 16
|
5月前
|
存储 Unix Linux
进程间通信方式-----管道通信
【10月更文挑战第29天】管道通信是一种重要的进程间通信机制,它为进程间的数据传输和同步提供了一种简单有效的方法。通过合理地使用管道通信,可以实现不同进程之间的协作,提高系统的整体性能和效率。
|
5月前
|
消息中间件 存储 供应链
进程间通信方式-----消息队列通信
【10月更文挑战第29天】消息队列通信是一种强大而灵活的进程间通信机制,它通过异步通信、解耦和缓冲等特性,为分布式系统和多进程应用提供了高效的通信方式。在实际应用中,需要根据具体的需求和场景,合理地选择和使用消息队列,以充分发挥其优势,同时注意其可能带来的复杂性和性能开销等问题。
|
6月前
|
运维 Linux
Linux查找占用的端口,并杀死进程的简单方法
通过上述步骤和命令,您能够迅速识别并根据实际情况管理Linux系统中占用特定端口的进程。为了获得更全面的服务器管理技巧和解决方案,提供了丰富的资源和专业服务,是您提升运维技能的理想选择。
284 1
|
6月前
|
存储 Python
Python中的多进程通信实践指南
Python中的多进程通信实践指南
81 0
|
7月前
|
编译器
【收藏】内核级利用通用Hook函数方法检测进程
【收藏】内核级利用通用Hook函数方法检测进程
|
7月前
|
SQL 网络协议 数据库连接
已解决:连接SqlServer出现 provider: Shared Memory Provider, error: 0 - 管道的另一端上无任何进程【C#连接SqlServer踩坑记录】
本文介绍了解决连接SqlServer时出现“provider: Shared Memory Provider, error: 0 - 管道的另一端上无任何进程”错误的步骤,包括更改服务器验证模式、修改sa用户设置、启用TCP/IP协议,以及检查数据库连接语句中的实例名是否正确。此外,还解释了实例名mssqlserver和sqlserver之间的区别,包括它们在默认设置、功能和用途上的差异。
|
20天前
|
Linux
linux命令详细说明以及案例
本文介绍了常用的 Linux 命令及其详细说明和示例,包括:`ls`(列出目录内容)、`cd`(更改目录)、`rm` 和 `mv`(删除与移动文件)、`grep`(搜索文本)、`cat`(显示文件内容)以及 `chmod`(更改文件权限)。每个命令均配有功能描述、选项说明及实际案例,帮助用户更好地掌握 Linux 命令的使用方法。
119 56
|
5天前
|
Linux 定位技术
Linux系统中的cd命令:目录切换技巧
踏过千山,越过万水,人生就是一场不断前行的旅程,总充满了未知与挑战。然而,“cd”命令如同你的旅伴,会带你穿梭在如棋盘一般的文件系统中,探索每一处未知。希望你能从“cd”命令中找到乐趣,像是掌控了一种络新妙的魔法,去向未知进发,开始你的探索之旅。
76 24