Linux进程通信之命名管道

(。・∀・)ノ゙嗨!你好这里是ky233的主页:这里是ky233的主页,欢迎光临~icon-default.png?t=N7T8https://blog.csdn.net/ky233?type=blog

点个关注不迷路⌯'▾'⌯

一、命名管道

1.原理

匿名管道只会让由血缘关系的进程来互相通信,命名管道可以让两个没有关系的进程来进行通信!

首先我们先创建出文件,然后让进程A以只写的方式打开,进程B以只写的方式打开,这样A就可以往fifo文件中写入,然后B来读取!

这其中数据并不会往磁盘中写入数据全部都是在内存中完成的! 

Linux进程通信之命名管道_第1张图片

2.命名管道的特点

与匿名管道基本一致

  • 管道是半双工通信
  • 管道随进程而终止
  • 命名管道任意多个进程间通信
  • 管道提供的是流式数据传输服务
  • 管道自带同步与互斥机制

3.mkfifo

mkfifo

创建好之后我们发现多了一个管道文件,然后我们echo一句话到这个文件里,这时候因为管道的另一端还没有打开,所以处于阻塞状态,然后我们打开另一端的管道,

输入端Linux进程通信之命名管道_第2张图片

输出端

此时就是一个进程向另一个进程写入消息的过程,这是通过管道的方式进行的!

 4.mkfifo的用法

int mkfifo(congst char *pathname,mode_t mode)
  • 参数一:文件名
  • 参数二:权限

我们可以通过程序实现两个独立进程的通信

思路:创建 server 和 client 两个独立的进程,server 创建并以读的方式打开管道文件, client以写 的方式打开管道文件,打开后俩进程可以进程通信

server:

#include "comm.hpp"


int main()
{
    //1.创建管道文件
    if(mkfifo(ipcPath.c_str(),MODE)<0)
    {
        perror("mkfifo");
        exit(1);
    }
    //2.正常的打开文件
    int fd = open(ipcPath.c_str(),O_RDONLY);
    if(fd<0)
    {
        perror("open");
        exit(1);
    }
    //3.编写正常的通信代码
    char buffer[SIZE];
    while(1)
    {
        memset(buffer,'\0',sizeof(buffer));
        ssize_t s =read(fd,buffer,sizeof(buffer)-1);
        if(s>0)
        {
            cout <<"client say"<< buffer<

client: 

#include "comm.hpp"

int main()
{
    //1.获取管道文件
    int fd = open(ipcPath.c_str(),O_WRONLY);
    if(fd<0)
    {
        perror("open");
        exit(1);
    }
    //2.通信
    string buffer;
    while(1)
    {
        cout<<"Please Enter Message Line:>";
        getline(cin,buffer);
        write(fd,buffer.c_str(),buffer.size());

    }


    //3.关闭
    close(fd);
    return 0;
}

 comm.hpp

#ifndef _COMM_H_
#define _COMM_H_
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

using namespace std;

#define SIZE 128
#define MODE 0666
string ipcPath = "./fifo.ipc";




#endif

运行程序我们就可以发现两个进程实现了通信! 

Linux进程通信之命名管道_第3张图片

你可能感兴趣的:(linux,运维,服务器)