管道:有名管道、无名管道
通信:
单工通信:固定的读端和写端 -- 广播
半双工通信:同一时刻,只有有一方写,另外一方读:对讲机
全双工通信:随时两方都能读写 -- 电话
特点:
管道属于半双工通信;
先进先出;
读取管道: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,没有返回-1
if(res == -1) //如果不存在
{
res = mkfifo("1.fifo",0666); //创建1.fifo
if(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;
}
两个代码同时运行,第一个是写端,第二个是读端