内容: 命名管道是另一种管道,他可以在无血缘关系的进程之间使用
函数原理:
1、FIFO是linux基础文件类型中的一种,但FIFO文件在磁盘上没有数据,仅仅用来标识内核中一条通道。
2、各进程可以打开这个文件进行read/write,实际上是读写内核通道,这样就实现了进程间通信。
创建fifo文件函数接口:
int mkfifo(const char *pathname,mode_t mode);
命令行直接创建: mkfifo 管道文件名
管道打开规则:
1、如果当前打开操作是为读而打开FIFO时
O_NONBLOCK disable:阻塞直到有相应进程为写而打开该FIFO
O_NONBLOCK enable:立即返回成功
2、如果当前打开操作是为写而打开FIFO时
O_NONBLOCK disable:阻塞直到有相应进程为读而打开该FIFO
O_NONBLOCK enable:立即返回失败,错误码为ENXIO
代码示例:
一、数据写入代码:
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<string.h>
int main(int argc,char *argv[]){
if(argc != 2){
printf("please input the fifo !\n");
return -1;
}
int fd = open(argv[1],O_WRONLY);
while(1){
write(fd, "hello world", strlen("hello world") + 1);
sleep(1);
}
close(fd);
return 0;
}
二、数据读出代码:
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<string.h>
int main(int argc,char *argv[]){
if(argc != 2){
printf("./a.out fifoname\n");
return -1;
}
int fd = open(argv[1],O_RDONLY);
char buf[12];
int ret ;
while(1){
sleep(2);
ret = read(fd,buf,sizeof(buf));
if(ret > 0){
printf("read:%s\n",buf);
}
memset(buf,'\0',sizeof(buf));
}
close(fd);
return 0;
}
运行结果:
大四学生一枚,如果文章有错误的地方,欢迎在下方提出,每条评论我都会去认真看并回复,同时感谢指正的前辈。有喜欢C/C++,linux的同学欢迎私信一起讨论学习。