Linux进程通信之命名管道

(。・∀・)ノ゙嗨!你好这里是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

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

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值