特点:
1.使互不相关的两个进程互相通信
2.通过路径名来指出,并且在文件系统中可见,但内容存放在内存中
3.进程通过文件IO来操作有名管道
4.有名管道遵循先进先出原则
5.不支持lseek()操作
函数:
#include<sys/types.h>
#include<sys/stat.h>
int mkfifo (const char *filename,mode_t mode)
功能:
创建有名管道
参数:
filename:指向要创建的命名管道文件的路径名
mode:指定新创建的FIFO文件的权限位,类似于chmod
返回值:
成功:0
失败:-1;并设置errno号
#include<stdio.h> #include<sys/types.h> #include<sys/stat.h> #include<errno.h> int main { if(mkfifo("fifo",0666)<0)///创建有名管道 { if(errno==EEXIST)//容错处理们。。 printf("file exist\n"); else {perror("mkfifo err");return -1;} } printf("mkfifo success\n"); return 0; }
#include<sys/stat.h> #include<unistd.h> int main { int a =mkfifo("myfifo",0666); if(status==-1) {perror("mkfifo failed");return -1;} printf("FIFO created success\n"); return 0; }
补充:
1.当管道文件存在(报错提示 file exists)时的处理方式:
判断errno的值为EEXIST时,只是打印提示语句,并不退出程序
if(errno == EEXIST)
2.注意代码中出现 errno,需要添加头文件 #include <errno.h>
操作
open 打开
int a=open("/path/to/fifo",O_WRONLY);//写入
int b=open("/path/to/fifo",O_RDONLY);//读取
写入数据
write(a,"hello shiny",10);
读取数据+关闭
char buf[100];
read(a,buf,sizeof(buf));
printf("read:%s\n",buf);
//a是之前打开的FIFO文件描述符,而buf是一个缓冲区用于存储读取的数据
close(a);
//完成读写操作后,应该关闭FIFO以释放资源