Linux进程通信之命名管道

发布时间:2024年01月15日

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

点个关注不迷路?'?'?

一、命名管道

1.原理

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

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

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

2.命名管道的特点

与匿名管道基本一致

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

3.mkfifo

mkfifo

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

输入端

输出端

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

?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<<endl;
            
        }
        else if(s==0)
        {
            cout<<"read end of file,clien quit, server quit too!"<<endl;
            break;
        }
        else
        {
            perror("read");
            break;
        }

    } 
    //4.关闭文件
    close(fd);
    unlink(ipcPath.c_str());
    return 0;
}

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 <iostream>
#include <string>
#include <cstdio>
#include <cstring>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

using namespace std;

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




#endif

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

文章来源:https://blog.csdn.net/ky233/article/details/134187496
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。