阅读量:0
有名管道FIFO
有名管道是文件系统中可见的文件,但是不占用磁盘空间,仍然在内存中。可以通过 mkfifo命令创建有
名管道(在共享目录不能使用mkfifo)
有名管道与无名管道一样,在应用层是基于文件接口进行操作
有名管道用于任意进程之间的通讯,当管道为空时,读进程会阻塞。
创建有名管道
mkfifo()
在shell中使用mkfifo 命令
mkfifo filename
mkfifo 函数 (在代码中使用其创建管道文件)
例子
一个进程写,一个进程读
首先通过命令创建管道文件:fifo
mkfifo fifo
read.c
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #define PATH_FIFO "/home/yujiu/fifo" void if_error(int,char*); int main(){ int res=0; res=access(PATH_FIFO,F_OK); if_error(res,"access"); int fd=open(PATH_FIFO,O_RDONLY); if_error(fd,"read"); char buf[128]; ssize_t byte =0; while((byte=read(fd,buf,sizeof(buf)))>0){ printf("read:%s\n",buf); memset(buf,0,sizeof(buf)); } close(fd); return 0; } void if_error(int res,char* str){ if(res==-1){ perror(str); exit(1); } }
write.c
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #define PATH_FIFO "/home/yujiu/fifo" void if_error(int,char*,int); int main(){ int res=0; res=access(PATH_FIFO,F_OK); if_error(res,"access",-1); int fd=open(PATH_FIFO,O_WRONLY); if_error(fd,"read",fd); char buf[128]; ssize_t byte=0; while(1){ memset(buf,0,sizeof(buf)); printf("input:\n"); fgets(buf,sizeof(buf),stdin); buf[strlen(buf)-1]='\0'; byte=write(fd,buf,strlen(buf)); if_error(byte,"write",fd); if(strcmp(buf,"exit")==0){ break; } } close(fd); return 0; } void if_error(int res,char* str,int fd){ if(res==-1){ perror(str); if(fd!=-1){ close(fd); } exit(1); } }