有名管道(命名管道)

来源:互联网 发布:中国网络诗歌网高研班 编辑:程序博客网 时间:2024/05/16 10:16
有名管道又称为FIFO 文件,我们对有名管道的操作可以采用操作文件的方法,如使用 open read
write 等,有名管道适用于任何两个进程间通信。
FIFO 文件和普通文件的对比
1.读取FIFO文件的进程只能以“O_RDONLY”方式打开FIFO 文件
2.写FIFO文件的进程只能以“O_WRONLY”的方式打开FIFO文件。
3.FIFO文件里面的内容被读取后,就消失了,但是普通文件的内容读取后还存在。
学习有名管道的操作:
1.创建管道(fifo 文件)->mkfifo
2.删除管道 unlink
3.打开管道 open
4.关闭管道 close
5.读/写管道 read/write


函数接口:
1》函数原型:
int mkfifo(const char * pathname,mode_t mode)
头文件:
#include <sys/types.h>
#include <sys/stat.h>
函数功能:
创建一个FIFO文件(有名管道)
返回值:成功 :0
失败:-1
参数说明:
pathname:创建的fifo文件名字(带路径)
mode_t :文件的操作权限


2》函数原型:
int unlink(const char * pathname);
函数功能:
删除文件(包括fifo文件)
头文件:
#include<unistd.h>
返回值 :
成功 :0
失败 :-1
参数:
pathname:要删除的文件名字(带路径)

范例代码:
说明:有名管道范例:实现两个任意进程间通信,创建两个进程,一个是读进程,另一个写进程;
写进程:主要是创建fifio 文件;并将数据写入文件, 退出;
读进程: 主要读取fifo 文件的数据,并打印出来,退出
写进程代码:write_fifo.c
#include <sys/types.h>
#include<sys/fcntl.h>
#include<sys/stat.h>
#include <unistd.h>
#define FIFO_PATH "/tmp/fifo"
int main()
{
int fd;
char inbuf[1024]="wangzhibo write data to fifo";
mkfifo(FIFO_PATH ,0777);
fd=open(FIFO_PATH ,O_WRONLY);//写进程打开方式只能以O_WRONLY方式
write(fd,inbuf,sizeof(inbuf));
close(fd);
}
读进程范例代码:read_fifo.c
#include<sys/types.h>
#include<sys/fcntl.h>
#include<unistd.h>
#include<stdio.h>
#define FIFO_PATH "/tmp/fifo"
int main()
{
int fd;
char buf[1024]={0};
fd =open(FIFO_PATH ,O_RDONLY);//读进程只能以O_RDONLY方式打开fifo文件
read(fd,buf,1024);
printf("read data:%s\n",buf);
close(fd);
unlink(FIFO_PATH );
}

运行程序:
首先运行write_fifo 程序,会处于阻塞状态,知道运行read_fifo程序读取fifo文件数据;