1.命名管道和匿名管道在本质上没有区别,都是内存级的文件不会和磁盘发生交互
2.匿名管道是用pipe()创建,并且在创建时读写都已经打开,命名管道是用mkfifo创建,创建之后不会默认打开,需要用户手动开启。
3.匿名管道只能实现具有血缘关系进程之间的通信,而命名管道能实现俩个毫无关系进程之间的通信
下面是命名管道的一些相关代码
#include "my_mkfifo.hpp"
int main()
{
// 创建命名管道
int n = mkfifo(ipcPath.c_str(), 0666);
if (n == -1)
{
perror("mkfifo");
exit(1);
}
cout << "创建命名管道成功" << endl;
// 打开命名管道
pid_t fd = open(ipcPath.c_str(), O_RDONLY);
if (fd == -1)
{
perror("open");
exit(1);
}
cout << "打开命名管道成功" << endl;
for (int i = 0; i < 3; i++)
{
//创建子进程
pid_t id = fork();
if (id == 0)
{
// 读端开始读取程序
while (true)
{
char buff[128] = {0};
memset(buff, 0, sizeof(buff));
ssize_t m = read(fd, buff, sizeof(buff));
if (m > 0)
{
cout << "读取成功 读取内容为:" << buff << endl;
cout<<getpid()<<endl;
}
if (m == 0)
{
cout << "写端关闭 退出程序" << endl;
break;
}
if (m < 0)
{
cout << "读取异常 退出程序" << endl;
break;
}
}
exit(1);
}
}
//父进程等待子进程结束
for(int i=0;i<3;i++)
{
waitpid(-1,nullptr,0);
}
// 关闭读端
close(fd);
// 删除命名管道文件
unlink(ipcPath.c_str());
return 0;
}
#include "my_mkfifo.hpp"
int main()
{
//打开管道文件
pid_t id=open(ipcPath.c_str(),O_WRONLY);
if(id==-1)
{
perror("open");
exit(1);
}
cout<<"打开管道文件成功"<<endl;
//想管道文件写入内容
while(true)
{
ssize_t n=write(id,"hello world",20);
if(n==0)
{
cout<<"停止发送,退出发送模式"<<endl;
break;
}
if(n>0)
{
cout<<"发送成功"<<endl;
}
sleep(1);
}
//发送完毕,关闭命名管道写端
close(id);
return 0;
}