FIFO通信
fifo: (有名管道) 应用于非血缘关系进程间(不能反复读取)
-
用于非血缘关系进程间通信
-
创建管道的伪文件:
命令: mkfifo
函数:int mkfifo(const char *pathname,mode_t mode); -
内核会针对fifo 文件开辟一个缓冲区,操作fifo文件,可以操作缓冲区,实现进程间通信—实际上就是文件读写
例如:
//04_fifo_w.c
#include<sstdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<string.h>
int main()
{
if(argc!=2)
{
printf("./a.put fifoname\n");
return -1;
}
//当前目录有一个myfifo文件
//打开fifo文件‘
printf("begin write...\n");
int fd=open(argv[1],O_WRONLY);
prinhtf("end write...\n");
//写
char buf[256];
int num=1;
while(1)
{
memset(buf,0x00,sizeof(buf));
sprintf(buf,"xiaoming%04d",num++);
write(fd,buf,strlen(buf));
sleep(1);
//循环写
}
//关闭描述符
close(fd);
return 0;
}
//04_fifo_r.c
#include<stdio.h>
#include<unistd.h>\
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<cstrin,h>
int main()
{
if(argc!=2)
{
printf("./a.out filename\n");
return -1;
}
printf("begin read...\n");
int fd=open(argv[1],O_RDONLY);
prinhtf("end read...\n");
char buf[256];
while(1)
{//循环读
memset(buf,0x00,sizeof(buf));
ret=read(fd,buf,sizeof(buf));
if(ret>0)
{
printf("read:%s\n",buf);
}
}
close(fd);
return 0;
}
输出:先执行写,输出显示“begin write…” 执行完open函数后进程被阻塞了,一直到另外一个进程执行读,进程才会被释放
注意:
-
调用open函数,打开FIFO 文件,只打开读,只打开写,会阻塞
-
打开fifo文件的时候,read端会阻塞等待write端open,write端同理,也会阻塞等待另一端打开
-
man 7 fifo 查看FIFO 信息