命名管道——进程间通信
创作时间:
作者:
@小白创作中心
命名管道——进程间通信
引用
CSDN
1.
https://blog.csdn.net/2302_80105876/article/details/145965934
命名管道(FIFO)是Linux系统中一种特殊的文件类型,用于实现进程间的通信。与匿名管道不同,命名管道具有文件系统路径名,可以被任意进程访问。本文将详细介绍命名管道的创建、使用方法以及其与匿名管道的区别。
一、命名管道的使用
1.创建命名管道
1.1.在命令行中:
创建:
mkfifo 管道名
删除:
rm -rf 管道名
或者:
unlink 管道名
1.2.在程序中
创建:
声明如下:
#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char *pathname, mode_t mode);
- 返回值:成功:返回0。失败:返回-1,并设置 erron 以指示错误类型。
- 参数1:指向一个以空字符结尾的字符串,表示要创建的命名管道的路径。
- 参数2:指定文件的权限位(mode bits),类似于 open 函数中的权限参数。
销毁:
#include <unistd.h>
int unlink(const char *pathname);
- 返回值:如果成功删除文件,返回0,如果失败返回-1,并设置全局变量 errno 以指示具体的错误类型。
- 参数1:指向一个以空字符结尾的字符串,表示要创建的命名管道的路径。
示例:
mkfifo("./filename",0666);//创建
unlink("./filename");//销毁
2.使用命名管道
当创建好管道后,进程通信就是简单的文件读写,如下:
把文件server.cc生成的程序作为读端。
#include<iostream>
#include<sys/types.h>
#include<sys/stat.h>
#include<cstdio>
#include<fcntl.h>
#include<unistd.h>
using namespace std;
int main()
{
int f = mkfifo("./file",0666);
int r_fd = open("file",O_RDONLY);
char buf[1024];
while(true)
{
int n = read(r_fd,buf,sizeof(buf)-1);
if(n > 0)
{
buf[n]='\0';
printf("Client say# %s\n",buf);
}
else if(n == 0) break;
else return 1;
}
close(r_fd);
unlink("file");
return 0;
}
注:对于管道的创建与销毁在其中一端进行就行。
假设把文件client.cc生成的程序作为写端
#include<iostream>
#include<sys/types.h>
#include<sys/stat.h>
#include<cstdio>
#include<fcntl.h>
#include<unistd.h>
using namespace std;
int main()
{
int w_fd = open("file",O_WRONLY);
while(true)
{
string message;
cout<<"Please enter: ";
getline(cin,message);
write(w_fd,message.c_str(),message.size());
}
close(w_fd);
return 0;
}
注意:该文侧重点在于讲解对命名管道的使用,所以以上代码中省略了对调用函数成功与否的判断,在实际开发中需要加以判断。
效果如下:
二、命名管道与匿名管道的区别
1.创建上
- 匿名管道是在程序中使用pipe进行创建并打开的。
- 命名管道可以在程序中使用mkfifo命令创建,也可以在程序中使用mkfifo函数创建。然后需要用open打开。
2.使用范围
- 匿名管道只能用于父子进程之间。
- 命名管道可用于任意进程之间。
三、管道的特性
注1:管道的四种特性和四种通信情况,对于匿名管道和命名管道都是一样的。
注2:管道的生命周期随进程,本质是内核中的缓冲区,命名管道文件只是标识,用于让多个进程找到同一块缓冲区,删除后,之前已经打开管道的进程依然可以通信
1.管道的五种特性
- 管道文件,自带同步机制。如上代码示例,如果写端和读端执行速度不一样,快的一端会迁就于慢的一端,最后实现同步。
- 管道是面向字节流的。怎么读与怎么写并没有联系,比如写入“hello world”,但可能读到“hel”,这取决于你要读多少字节。
- 管道是单向通信的。也就是a(表示进程)写的时候b读。b写的时候a在读。而不是既在写同时也在读。
- 管道(文件)的生命周期是随进程的。进程结束管道也随之销毁。
2.管道的四种通信情况
- 写慢,读快 --- 读端就要阻塞(等待写端写入)。
- 写快,读慢 --- 到管道容量满了后,写端就要阻塞(等待读端读取数据,然后就可以覆盖式地继续往管道写入)。
- 写关闭,读继续 --- read就会返回0,表示文件结尾。
- 写继续,读关闭 --- 写端不再有意义,系统会杀掉写端进程。
热门推荐
新型武器改变战局,以色列军队调整战略
红兔毛水晶九尾狐
一文读懂傅里叶变换处理图像的原理
右斜裂胸膜增厚是怎么回事
【如何获取统计数据】“国家数据”一站式查询
宝来车子的综合性能如何?这种性能在不同路况下的表现怎样?
个体户核定征收:简化税务流程,助力创业者轻松发展
大牙开裂和松动的情况下,是否需要进行拔除处理?
贺兰山东麓的帝王陵园“西夏王陵”,探寻到西夏王朝的兴衰历程
Countdown Timer
视频号配乐时间如何同步,提升内容创作效率的技巧
手机照片不翼而飞?别急,一步步教你找回!
存款利率一降再降,你还会选择存钱吗?做好这三项准备
宋太祖为什么一直不把赵德昭立为太子,导致皇位被二弟抢走?
如何优化用印管理方案的细节?
白鱼的功效与作用 白鱼的营养价值
广东低空经济发展调研报告发布!产业格局雏形之下正深度融合
2025年双碳领域十大关键发展趋势
中国护照全新改版:提升国际形象,加强安全防护
幼儿语言表达能力培养指南:六大维度全面解析
红茶到底是酸性还是碱性?详细分析及解答
电脑删除照片怎么恢复?不用求人!盘点7个恢复宝典
布加综合征三联征
48岁撒贝宁再次被保送,央视连续发文祝贺,直播间露面满脸幸福
如何正确使用电话录音功能:技巧与法律注意事项解析
RS485偏置电阻和终端电阻的作用及选取方法
三元催化清洗剂配方化验成分还原及应用
道家修炼的最高境界
婴儿听力筛查:时间、方法及未通过筛查怎么办
孕妇产检算上班时间吗?法律这样规定