管道:有名管道、无名管道
通信:
单工通信:固定的读端和写端 -- 广播
半双工通信:同一时刻,只有有一方写,另外一方读:对讲机
全双工通信:随时两方都能读写 -- 电话
特点:
管道属于半双工通信;
先进先出;
读取管道:read,当管道为空的时候,read会阻塞;
管道中的内容一旦读取就没有了;
管道的大小:64k -- 1024*64 = 65536字节
管道写满,write会阻塞;
有名管道
1、创建管道文件 -- mkfifo
2、通过open打开管道文件:
传参:mode:只能选择:O_RDONLY和O_WRONLY中的一个;
管道任意一端没有打开,open函数会阻塞;
3、读写 read write;
一旦管道的写端关闭:读端read将不再阻塞,直接返回0
4、关闭:close
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>int main()
{int res = access("1.fifo",F_OK); //检测1.fifo是否存在//access 判断文件是否有某种权限或者判断文件是否存在//函数原型:int access(const char *pathname, int mode);//形参:pathname:文件名(路径) //mode:F_OK 只判断是否存在、R_OK 只判断是否有读权限、W_OK 只判断是否有写权限、X_OK 判断是否有执行权限//返回值:有mode填写的权限,返回0,没有返回-1if(res == -1) //如果不存在{res = mkfifo("1.fifo",0666); //创建1.fifoif(res == -1) //文件创建失败{perror("mkfifo");return -1;}}int w_fd = open("1.fifo",O_WRONLY); //以只写的方式打开1.fifo这个文件if(w_fd == -1) //打开失败{perror("open");return -1;}char ch = 'A'; //用于循环写入管道文件int count = 0; //定义变量,统计写入的次数while(1){write(w_fd,&ch,sizeof(ch)); //写入到1.fifo这个文件,一次写入一个字符count++;printf("count = %d\n",count);}close(w_fd);return 0;
}
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>int main()
{int res = access("1.fifo",F_OK);if(res == -1){res = mkfifo("1.fifo",0666);if(res == -1){perror("mkfifo");return -1;}}int r_fd = open("1.fifo",O_RDONLY);if(r_fd == -1){perror("open");return -1;}while(1){}return 0;
}
两个代码同时运行,第一个是写端,第二个是读端