FIFO
虽然有名管道在亲缘进程间非常方便,但由于它没有名字所以使用范围非常有限。FIFO不同于有名管道之处在于它提供一个路径名与之关联,以FIFO文件的形式存在于文件系统中。这样只要其它进程可以访问该路径,就能与创建FIFO的进程通过FIFO进行通信。
FIFO严格遵循先进先出,对管道及FIFO的读总是从开始处返回数据,对它们写则在末尾添加数据。它们不支持诸如lseek()等文件定位操作。
程序演示:
两个程序运行有先后顺序,先运行fifor.c编译后的程序
程序功能是通过FIFO实现文件的拷贝
#include
#include
#include
#include
#include
#include
#define SIZE 1024 //缓冲区大小
#define FIFO_SERVER "../FIFO" //FIFO文件路径
//错误退出函数
void err_exit(char* msg)
{
printf("%s\n",msg);
exit(EXIT_FAILURE);
}
int main(int argc,char* argv[])
{
if(argc != 2)
err_exit("参数不正确!");
//切记加上0666否则其他进程无法获取FIFO文件的读取权限
if(mkfifo(FIFO_SERVER,O_CREAT | O_EXCL | 0666) == -1)
{
//判断是否是FIFO文件已创建的错误
if(errno != EEXIST)
err_exit("Create FIFO error!");
}
int fdw = open(FIFO_SERVER,O_WRONLY);
if(fdw < 0)
err_exit("Open FIFO file error");
int fdr = open(argv[1],O_RDONLY);
if(fdr < 0)
err_exit("source file open error");
size_t n;
char buf[SIZE];
while((n = read(fdr,buf,SIZE)) > 0)
{
write(fdw,buf,n);
}
close(fdr);
close(fdw);
return 0;
}
#include
#include
#include
#include
#include
#include
#define SIZE 1024 //缓冲区大小
#define FIFO_SERVER "../FIFO" //FIFO文件路径
//错误退出函数
void err_exit(char* msg)
{
printf("%s\n",msg);
exit(EXIT_FAILURE);
}
int main(int argc,char* argv[])
{
if(argc != 2)
err_exit("参数不正确!");
int fdr = open(FIFO_SERVER,O_RDONLY);
if(fdr < 0)
err_exit("Open FIFO file error");
int fdw = open(argv[1],O_WRONLY | O_CREAT,0666);
if(fdw < 0)
err_exit("purpose file open error");
size_t n;
char buf[SIZE];
while((n = read(fdr,buf,SIZE)) > 0)
{
write(fdw,buf,n);
}
close(fdr);
close(fdw);
unlink(FIFO_SERVER);//删除FIFO文件
return 0;
}