fifo有名管道:
简介:不同进程间通过管道文件名找到内核中的管道,进行通信
功能:可以在非亲缘关系间进程通信
特点:有名管道指的是文件系统存放的文件名,而管道是存在内核中
练习:运行两个程序,一个程序建立fifo,打开fifo,通过终端向其中写入数据,另一个程序打开fifo并读取其中数据输出到终端
运行效果:
write端:
read端:
源码提供:
read.c
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int read_fifo(int fd_fifo)
{
char buf[1024];
int n;
while(1)
{
n = read(fd_fifo,buf,sizeof(buf) - 1);
buf[n] = '\0';
if(n == 0)
break;
if(strncmp(buf,"quit",4) == 0)
break ;
printf("%d %s\n ", n, buf);
}
return 0;
}
int main(int argc, const char *argv[])
{
pid_t pid;
int fd_fifo1;
if(mkfifo(argv[1],0666) < 0&&errno != EEXIST)
{
fprintf(stderr,"FAIL TO CREAT FIFO:%s , %s",
argv[1],strerror(errno));
exit(EXIT_FAILURE);
}
if((fd_fifo1 = open(argv[1],O_RDONLY) ) < 0)
{
fprintf(stderr,"FAIL TO OPEN FIFO:%s , %s\n",
argv[1],strerror(errno));
exit(EXIT_FAILURE);
}
read_fifo(fd_fifo1);
exit(EXIT_FAILURE);
}
write.c
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int write_fifo(int fd_fifo )
{
char buf[1024];
while(1)
{
fgets(buf,sizeof(buf),stdin);
buf[strlen(buf) -1] = '\0';
if(strncmp(buf,"quit",4) == 0)
break;
write(fd_fifo , buf,strlen(buf));
}
return 0;
}
int main(int argc, const char *argv[])
{
int fd_fifo1;
if(mkfifo(argv[1],0666) < 0&&errno != EEXIST)
{
fprintf(stderr,"FAIL TO CREAT FIFO:%s , %s\n",
argv[1],strerror(errno));
exit(EXIT_FAILURE);
}
if((fd_fifo1 = open(argv[1],O_WRONLY) ) < 0)
{
fprintf(stderr,"FAIL TO OPEN FIFO:%s , %s\n",
argv[1],strerror(errno));
exit(EXIT_FAILURE);
}
write_fifo(fd_fifo1);
exit(EXIT_FAILURE);
}