- 有名管道:
-
区别于
无名管道,其可以用于任意进程间的通信
; - 同无名管道一样,也是
半双工的通信方式
; - 有名管道的大小也是
64KB
; - 也是
不能使用lseek函数
; - 其本质上,是在内存上,在文件系统上
只是一个标识
; - 有名管道会创建一个管道文件,只需要打开这个文件,进行相应的读写操作即可;
- 读写特点:
- 若读端
存在
写管道,那么有多少数据,就写多少数据,直到有名管道写满
为止,此时会出现写阻塞
; - 若读端
不存在
写管道,会出现两种情况
; - 第一种:
读端
没有打开,写端
在open函数
的位置阻塞; - 第二种:
读端
打开后关闭,会出现管道破裂
的现象; - 若写端
存在
读管道,那么有多少数据,就读多少数据,没有数据的时候,会出现阻塞等待
; - 若写端
不存在
读管道,也会出现两种情况
; - 第一种:
写端
没有打开,读端
在open函数
的位置阻塞; - 第二种:
写端
打开后关闭,有多少数据,就读多少,没有数据的时候,就会立即返回,即非阻塞的状态
; - 创建有名管道(mkfifo函数):
#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char *pathname, mode_t mode);
/*
功能:
创建管道文件
参数:
pathname:管道路径和名字
mode:管道文件的权限
返回值:
成功 0
失败 -1 重置错误码
*/
- 示例代码:
- 写端:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/wait.h>
#include <stdbool.h>
int main(int argc, char const *argv[])
{
int fd = open("./fifo_k",O_WRONLY);
if(-1 == fd)
{
perror("open error");
exit(-1);
}
char buf[128] = {0};
while(true)
{
memset(buf,0,sizeof(buf));
fgets(buf,sizeof(buf),stdin);
buf[strlen(buf) - 1] = '\0';
write(fd,buf,sizeof(buf));
if(!strncmp(buf,"quit",4))
{
exit(-1);
}
}
close(fd);
return 0;
}
- 读端:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/wait.h>
#include <stdbool.h>
int main(int argc, char const *argv[])
{
int fd = open("./fifo_k",O_RDONLY);
if(-1 == fd)
{
perror("open error");
exit(-1);
}
char buf[128] = {0};
while(true)
{
memset(buf,0,sizeof(buf));
read(fd,buf,sizeof(buf));
if(!strncmp(buf,"quit",4))
{
exit(-1);
}
printf("写端发来的数据[%s]\n",buf);
}
close(fd);
return 0;
}
- 运行结果:
- 写端:
hello
china
quit
- 读端:
写端发来的数据[hello]
写端发来的数据[china]
文章来源地址https://www.toymoban.com/news/detail-734143.html
文章来源:https://www.toymoban.com/news/detail-734143.html
到了这里,关于多进程间通信学习之有名管道的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!