管道
相关概念
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
 只有创建不同,使用方法都和文件一样