linux进程间通信之FIFO

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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章