// fifo_w.c
#include<stdio.h>
#include<unistd.h>
#include<errno.h>
#include<stdlib.h>
#include<sys/types.h>
#include<string.h>
#include<sys/stat.h>
#include<fcntl.h>
/*
命名管道
不同于匿名管道,命名管道是可以在没有血缘关系的进程之间进行通信的,
它会与系统中的一个路径名进行关联,以文件的形式存在文件系统中,因此,
系统中的不同进程可以通过FIFO的路径名来访问文件,实现彼此之间的通信。
FIFO本质和匿名管道相同,都是由系统内核管理的一块缓存,对该文件进行读写不会改变
文件的大小(一般的读写操作会改变文件的大小,在此提醒)。FIFO与管道一样,
当缓冲区为空或缓冲区满时,会产生阻塞。
*/
int main(int argc, char* argv[]){
// 判断是否传入文件名
if (argc< 2) {
printf("please input file name\n");
exit(1);
}
// 判断 fifo 文件是否存在
int ret = access(argv[1], F_OK);
if (ret == -1){
// 如果 fifo 不存在就创建 fifo 0644 0 不用管 644 6=4+2+1 4 1 <-- 4 read 2 write 1 create
int r = mkfifo(argv[1], 0664);
if (r== -1){
perror("mkfifo error");
exit(1);
} else{
printf("fifo creat success!\n");
}
}
// 以上的操作都是为了创建 fifo 文件,文件名称是传递通过main 函数参数传进来的 ./demo mkfifo
int fd = open(argv[1], O_WRONLY);
while (1)
{
char* p = "hello world";
write(fd, p, strlen(p)+1);
sleep(1);
}
close(fd);
return 0;
}
// fifo_r.c
#include<stdio.h>
#include<unistd.h>
#include<errno.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<string.h>
#include<fcntl.h>
int main(int argc, char* argv[]){
// 判断是否传入文件名
if (argc< 2) {
printf("please input file name\n");
exit(1);
}
// 判断 fifo 文件是否存在
int ret = access(argv[1], F_OK);
if (ret == -1){
// 如果 fifo 不存在就创建 fifo 0644 0 不用管 644 6=4+2+1 4 1 <-- 4 read 2 write 1 create
int r = mkfifo(argv[1], 0664);
if (r== -1){
perror("mkfifo error");
exit(1);
} else{
printf("fifo creat success!\n");
}
}
// 打开文件
int fd = open(argv[1], O_RDONLY);
if (fd ==-1) {
perror("open error");
exit(1);
}
while (1){
char buff[1024];
// 不断读取 fifo 文件的内容,并打印出来
read(fd, buff, sizeof(buff));
printf("buf=%s\n", buff);
}
close(fd);
return 0;
}
输出如下:
zfz:Demo zhangfengzhou$ gcc fifo_write.c -o fifo_write
zfz:Demo zhangfengzhou$ gcc fifo_read.c -o fifo_read
zfz:Demo zhangfengzhou$ ./fifo_write mkfifo
fifo creat success!
zfz:Demo zhangfengzhou$ ./fifo_read mkfifo
buf=hello world
buf=hello world
buf=hello world
buf=hello world
buf=hello world
....
参考:
1. 《Linux编程基础》-黑马程序员