FIFO:
管道没有名字,最大的劣势在于只能用于由一个共同祖先进程的哥哥进程之间。
FIFO又名又名管道,每个FIFO有一个路径名与之关联,从而允许无亲缘关系的进程访问同一个FIFO。
FIFO由mkfifo创建。
#include<sys/types.h>
#include<sys/stat.h>
int mkfifo(const char *pathname, mode_t mode);
其中pathname为使用管道的两个进程都知道的管道文件路径名,mode为该文件的权限位,类似于open的第二个参数。
实际步骤:
- 使用mkfifo()函数创建一个管道文件myfifo;
- 进程1使用open()打开管道文件myfifo来写后进入休眠;
- 进程2使用open()打开管道文件来读后写入新数据,然后退出;
- 进程 1读取由进程2写入的数据后退出;
- 管道传输完毕,使用unlink()函数删除管道文件myfifo。
转自:http://www.cnblogs.com/0xcafebabe/p/4475904.html的例子:
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<fcntl.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<sys/wait.h>
#define MAXSIZE 1024
#define PATHNAME "/tmp/myfifo"
int main(int argc, char **argv)
{
pid_t pid;
int fd=-1;
char buffer[MAXSIZE]="";
if(mkfifo(PATHNAME,0644)<0)//在PATHNAME创建一个临时文件
{
perror("mkfifo()");
exit(1);
}
fflush(NULL);
pid=fork();//创建第一个子进程
if(pid<0)
{
perror("fork()");
exit(1);
}
if(!pid){
pid=fork();//创建第二个子进程
if(pid<0)
{
perror("fork()");
exit(1);
}
if(!pid){
exit(0);//退出父进程,则两个进程变为孤儿进程,由init接管
}
fd=open(PATHNAME,O_RDWR);//先从管道文件中读出数据后再追加写入数据
if(fd<0)
{
perror("open()");
exit(1);
}
read(fd,buffer,MAXSIZE);
printf("%s",buffer);
write(fd," world",7);
close(fd);
exit(0);
}
else
{
fd=open(PATHNAME,O_RDWR);//一个进程向管道文件写入后休眠1秒以让另一个进程先读出后自己再读数据,避免死锁
if(fd<0)
{
perror("open()");
exit(1);
}
write(fd,"hello",6);
sleep(1);
read(fd,buffer,MAXSIZE);
close(fd);
puts(buffer);
unlink(PATHNAME);
exit(0);
}
return 0;
}