![405e9f16ee1a76b83a23a07a9e968b0e.png](https://i-blog.csdnimg.cn/blog_migrate/6016b761836df4da212779561de97a43.jpeg)
图控大叔
构图传递思想
阅读从未如此简单!!!
01
前言
今天来说说Linux进程间通信:匿名管道。Linux环境下,进程间的通信方式有很多,有管道,IPC机制下的消息队列、共享内存和信号量,Posix机制下的有名信号量和无名信号量。今天要分享的内容是亲缘进程间的通信方式:匿名管道。待分享的内容还很多,慢慢来!
02
细述
![9369894ab8c3aaceed4e05101656bc10.gif](https://i-blog.csdnimg.cn/blog_migrate/7a4efb0c37d36ff2b37edce4169434fe.gif)
有名管道特点
1,他能够作用无任何亲缘关系的进程
2,全双工通信
3,操作有原子性
4,无法用lseek定位操作位置
![9369894ab8c3aaceed4e05101656bc10.gif](https://i-blog.csdnimg.cn/blog_migrate/7a4efb0c37d36ff2b37edce4169434fe.gif)
需包含头文件
#include
#include
#include
相关函数
创建一个有名管道文件
int mkfifo(const char *pathname, mode_t mode);
检查指定文件的权限(存在与否)
int access(const char *pathname, int mode);
打开
int open(const char *pathname, mode_t mode);
关闭
close(fifo_fd);
读操作
read(fifo_fd, buffer, sizeof(buffer));
写操作
write(fifo_fd, buffer, sizeof(buffer));
![9369894ab8c3aaceed4e05101656bc10.gif](https://i-blog.csdnimg.cn/blog_migrate/7a4efb0c37d36ff2b37edce4169434fe.gif)
部分函数说明
1、创建一个有名管道文件
int mkfifo(const char *pathname, mode_t mode);
参数说明
pathname:创建的管道文件名字(可以附加路径)
注意:一定得是linux下面的文件系统才能够创建出来,
禁止使用windows的共享文件夹)
mode:创建出来的文件的权限值(参照open函数的mode参数)
2、检查指定文件的权限(存在与否)
int access(const char *pathname, int mode);
参数说明
pathname:指定查的文件名(可以附加路径)
Mode:代表检查的权限
R_OK:判断是否可读
W_OK:判断是否可写
X_OK:判断是否可执行
F_OK:判断文件是否存在
返回值:
如果权限可以,则返回0,否则返回-1
![9369894ab8c3aaceed4e05101656bc10.gif](https://i-blog.csdnimg.cn/blog_migrate/7a4efb0c37d36ff2b37edce4169434fe.gif)
应用场景:
1,因为其操作具备原子性,经常拿过来作为一个多入口缓冲区
2,非亲缘进程间通信
![9369894ab8c3aaceed4e05101656bc10.gif](https://i-blog.csdnimg.cn/blog_migrate/7a4efb0c37d36ff2b37edce4169434fe.gif)
#include
#include
#include
#include
#include
#include
#include
#include
#define FIFO_NAME "myfifo" //文件名
int main(void){
int retval;
int fifo_fd;
ssize_t wr_ret;
char buffer[1024];
//判断FIFO_NAME代表的文件是否存在,不存在则进入判断语句中
if(access( FIFO_NAME, F_OK) != 0)
{
//创建一个有名管道文件FIFO_NAME:代表文件名,0644:代表创建文件的权限
mkfifo(FIFO_NAME, 0644);
}
fifo_fd = open(FIFO_NAME, O_RDWR);
if(fifo_fd == -1)
{
perror("打开管道出错\n");
return -1;
}
while(1)
{
fgets(buffer, sizeof(buffer), stdin);
wr_ret = write(fifo_fd, buffer, strlen(buffer));
if(wr_ret == -1)
{
perror("写入管道数据异常");
break;
}
}
close(fifo_fd);
return 0;
}
![9369894ab8c3aaceed4e05101656bc10.gif](https://i-blog.csdnimg.cn/blog_migrate/7a4efb0c37d36ff2b37edce4169434fe.gif)
#include
#include
#include
#include
#include
#include
#include
#define FIFO_NAME "myfifo" //文件名
int main(void){
int retval;
int fifo_fd;
ssize_t rd_ret;
char buffer[1024];
if(access( FIFO_NAME, F_OK) != 0)
{
mkfifo(FIFO_NAME, 0644);
}
fifo_fd = open(FIFO_NAME, O_RDWR);
if(fifo_fd == -1)
{
perror("打开管道出错\n");
return -1;
}
while(1)
{
bzero(buffer, sizeof(buffer));
rd_ret = read(fifo_fd, buffer, sizeof(buffer));
if(rd_ret == -1)
{
perror("读取管道数据异常");
break;
}
printf("读到大小为%ld,内容为 %s 的数据\n", rd_ret, buffer);
}
close(fifo_fd);
return 0;
}
03
结尾
好了,本次关于Linux下非亲缘进程间的通信方式:有名管道的分享,到这里就结束了,如果读者在阅读过程中发现有什么纰漏,希望后台留言一起交流!