一.fifo介绍
fifo函数用于创建命名管道,作用与匿名管道相同,不过可以在不同的进程之间使用,相当于对一个普通文件进行读写操作就可以了。
这个管道文件是任何有权限的进程都可以使用的,两端都像操作一个普通文件一样对它进行打开、读写、关闭动作就可以了,只要一端写入数据另一端就可以都出来。
#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char *pathname, mode_t mode);
参数列表:
pathname:管道文件的路径和文件名。
mode:创建管道文件的权限。传入的 mode 值要与系统的 umask 值做运算:(mode & ~umask)
返回值:成功返回 0,失败返回 -1 并设置 errno。
二. 代码实现
父进程先创建了两个进程,然后,直接退出,两个子进程之间没有关系,但可以使用fifo来进行通信。
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<fcntl.h>
#include<sys/stat.h>
int main(int argc,char *argv[])
{
int fifofd;
pid_t pid;
char path[]="/tmp/myfifo";
char buf[BUFSIZ];
if(mkfifo(path,0644)<0){
perror("mkfifo()");
exit(1);
}
fflush(NULL);
if((pid=fork())<0){
perror("fork()");
exit(1);
}
else if(pid==0){
if((fifofd=open(path,O_RDWR))<0){
perror("opne()");
exit(1);
}
write(fifofd,"hello!",7);
sleep(1);
read(fifofd,buf,BUFSIZ);
//fputs(buf,stdout);
printf("child 1 recieve data:%s\n",buf);
close(fifofd);
exit(0);
}
else{
if((pid=fork())<0){
perror("fork()");
exit(1);
}
else if(pid==0){
if((fifofd=open(path,O_RDWR))<0){
perror("opne()");
exit(1);
}
read(fifofd,buf,BUFSIZ);
//fputs(buf,stdout);
printf("child 2 recieve data:%s\n",buf);
write(fifofd,"hi,how are you",15);
close(fifofd);
exit(0);
}
else{
exit(0);
}
}
}