1. 概念
有名管道又称为FIFO文件,因为我们对有名管道的操作可以采用操作文件的方法,如使用open,read,write等。
与普通文件的区别:
- 读取fifo文件的进程只能以"RDONLY"方式打开fifo文件;
- 写fifo文件的进程只能以"WRONLY"方式打开fifo文件;
- fifo文件里面的内容被读取后,就从管道中消失了。但是普通文件里面的内容读取后还存在;
2. 创建有名管道(fifo文件)
2.1 函数原型
#include <sys/stat.h>
int mkfifo(const char *pathname, mode_t mode);
2.2 返回值
成功返回0,失败返回-1
2.3 参数
pathname:要创建的fifo文件的名字(带路径)
mode_t:创建的fifo文件的访问权限
3. 删除有名管道(fifo文件)
3.1 函数原型
#include <unistd.h>
int unlink(const char *pathname);
3.2 返回值
成功返回0,失败返回-1
3.3 参数
pathname:要删除的fifo文件的名字(带路径)
4. 示例
FIFO用于两个无关进程直接的通信。首先创建两个进程send和recv。
process1.c
#include<sys/types.h>
#include<sys/stat.h>
#include<stdio.h>
#include<fcntl.h>
#include<unistd.h>
#include<stdlib.h>
int main()
{
int fd,ret;
char str[10] = {"Hello"};
ret = mkfifo("fifo",0666); //创建FIFO文件
fd = open("fifo",O_WRONLY); //只写方式打开
write(fd,str,5);
close(fd);
return 0;
}
process2.c
#include<sys/types.h>
#include<sys/stat.h>
#include<stdio.h>
#include<fcntl.h>
#include<unistd.h>
#include<stdlib.h>
int main()
{
int fd;
char str[10] = {0};
fd = open("fifo",O_RDONLY);
read(fd,str,5);
printf("%s\n",str);
close(fd);
return 0;
}
编译运行:
[root@192 fifo]# gcc process1.c -o process1
[root@192 fifo]# gcc process2.c -o process2
[root@192 fifo]# ls
fifo process1 process1.c process2 process2.c
[root@192 fifo]#
先运行process1,再运行process2,即可看到打印结果。