第14课-有名管道通讯编程
14.1 核心理论--有名管道
有名管道又称为FIFO文件,因此我们对有名管道的操作可以采用操作文件的方法,如使用open,read,write等。
FIFO文件在使用上和普通文件又相似之处,但是也有不同之处:
1. 读取FIFO文件的进程只能以“RDONLY”方式打开fifo文件。
2. 写FIFO文件的进程只能以“WRONLY”方式打开fifo文件。
3. FIFO文件里面的内容被读取后,就消失了。但是普通文件里面的内容读取后还是存在的。
注:在vim命令里面,在底部打入:set nu可以显示行数。
14.2 函数学习
1. 创建有名管道
(1) 函数名
mkfifo
(2) 函数原形
int mkfifo(const char *pathname, mode_t mode);
(3) 函数功能
创建FIFO文件(有名管道)。
(4) 所属头文件
#include<sys/types.h>
#include<sys/stat.h>
(5) 返回值
成功:0
失败:-1
(6) 参数说明
pathname:我们创建的fifo文件的名字(包含路径)。
mode:fifo文件的访问权限
2. 删除有名管道
(1) 函数名
unlink
(4) 函数原形
int unlink(const char *pathname);
(5) 函数功能
删除FIFO文件(有名管道)以及普通文件。
(4) 所属头文件
#include<unistd.h>
(5) 返回值
成功:0
失败:-1
(6) 参数说明
pathname:我们要删除的文件的名字(包含路径)。
14.3 综合实例编程
任意两个进程利用有名管道通讯。
创建写进程程序:
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<stdio.h>
void main()
{
int fd;
/*1.创建fifo文件*/
mkfifo("/tmp/myfifo",0666);
/*2.打开fifo文件*/
fd = open("/tmp/myfifo",O_WRONLY);
/*3.写入数据fifo文件*/
write(fd,"hello fifo",11);
/*4.关闭fifo*/
close(fd);
}
创建读进程程序:
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<stdio.h>
void main()
{
int fd;
char c_buf[15];
/*1.打开fifo文件*/
fd = open("/tmp/myfifo",O_RDONLY);
/*2.读fifo文件数据*/
read(fd,c_buf,11);
printf("read is %s ",c_buf);
close(fd);
unlink("/tmp/myfifo");
}
运行结果:当运行./fifo_write时,程序会处于阻塞状态。直达我们在另一个窗口运行./fifo_read时,阻塞状态才会解除,并且打印:read is hello fifo