(。・?・)ノ゙嗨!你好这里是ky233的主页:这里是ky233的主页,欢迎光临~https://blog.csdn.net/ky233?type=blog
点个关注不迷路?'?'?
匿名管道只会让由血缘关系的进程来互相通信,命名管道可以让两个没有关系的进程来进行通信!
首先我们先创建出文件,然后让进程A以只写的方式打开,进程B以只写的方式打开,这样A就可以往fifo文件中写入,然后B来读取!
这其中数据并不会往磁盘中写入数据全部都是在内存中完成的!?
与匿名管道基本一致
mkfifo
创建好之后我们发现多了一个管道文件,然后我们echo一句话到这个文件里,这时候因为管道的另一端还没有打开,所以处于阻塞状态,然后我们打开另一端的管道,
输入端
输出端
此时就是一个进程向另一个进程写入消息的过程,这是通过管道的方式进行的!
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
运行程序我们就可以发现两个进程实现了通信!?