管道
相关概念
4种情况
- 正常情况,如果管道
没有数据
,读端陷入等待
,直到有数据才能唤醒 - 正常情况,如果管道被
写满
,写端陷入等待
,直到有空间才能唤醒 写段关闭
,读端一直读取,read返回0表示文件结束
读端关闭
,写端一直写,OS会直接杀死进程
5种特性
- 匿名管道,允许有
血缘关系
的进程进行通信 - 匿名管道,
默认
给读写端提供同步
机制 - 面向字节流
- 管道的
生命周期随进程
半双工
通信——单向通道
(管道读取是将数据复制出来,允许读取过的数据进行覆盖)
匿名管道
#include <unistd.h>
int pipe(int fd[2]);
fd[0]表示读端, fd[1]表示写端
匿名管道
的使用方式就是文件
的使用方式
匿名管道是一个内存级
的概念
有名管道
任意进程
进行通信
磁盘级
概念;在使用的时候会将磁盘数据加载进内存,每个进程创建一个struct_file,共用一份内存数据;不向磁盘刷新
文件打开必须是一个已经存在的文件,可以是一个绝对路径,也可以是相对路径
创建与删除
// 创建
mkfifo pipename // 命令行
int mkfifo(const char *filename,mode_t mode); // 函数// 删除
rm pipename // 命令行直接删除文件
int remove(const char *pathname); // 函数
有名管道
的使用方式也是文件
的使用方式
使用注意
ssize_t n=read(fd,str,sizeof(str));if(n==0||n==-1){close(fd);// 管道那边创建那边卸载remove(pathname);exit(-1);}else{str[n]='\0'; // 一定要写printf("%s\n",str);}
一定要在每次读取的
结尾加上\0
,不写自身是没有\0这个符号的
读取是将字符读出,然后清空;但是底层实现是将文件指针指向开头
位置重新写入
匿名管道读了就没了;有名管道读了之后只是将他拷贝的出去
匿名和有名的区别
匿名管道由pipe函数创建并打开
命名管道由mkfifo函数创建,打开用open
只有创建不同
,使用方法都和文件一样