有名管道

有名管道

  • 因为匿名管道只能用于有亲缘关系间的进程通信,所以为了没有亲缘关系之间的进程通信,提出了有名管道
  • 有名管道(FIFO)提供了一个路径名与之关联,并以FIFO的文件形式存放在文件系统中,打开方式和普通文件一样。这样进程之间只需要访问该路径,就可以彼此通过FIFO通信。
  • 一旦打开FIFO,就可以使用与匿名管道和其他文件的系统调用一样的IO系统调用
  • 先入先出,和匿名管道一样

有名管道和匿名管道区别

  • FIFO在文件系统中作为一个特殊文件存在,但FIFO中的内容却存在内存中
  • 当使用FIFO进程退出后,FIFO文件将继续保留在文件系统中
  • FIFO有名字,不相关的进程可以通过打开有名管道进行通信

有名管道的使用

1、通过命令创建
   mkfifo 名字
2、通过函数创建有名管道
   int mkfifo(const char* pathname,mode_t mode)
   
   #include <sys/types.h>
   #include <sys/stat.h>

   int mkfifo(const char *pathname, mode_t mode);
   参数:
   pathname:管道名称的路径
   mode:文件的权限,和open的mode一样
   返回值:
   成功:0
   失败: -1 并设置错误号

3、一旦使用mkfifo创建,就可以使用open打开,常见的文件IO函数都可以操作fifo文件
4、FIFO的读总是从开始处返回数据,对他们的写则是把数据的末尾开始添加

有名管道注意事项

  • 只读进程打开管道后,如果没有写进程存在,只读进程会被阻塞
  • 只写进程打开管道后,如果没有读进程存在,只写进程会被阻塞
  • 读管道
    • 管道中有数据 read返回实际读到的字节数
    • 管道中无数据
      • 管道写端被全部关闭,read返回0,相当于读到文件末尾
      • 写端没有全部被关闭,read阻塞等待
  • 写管道
    • 管道读端被全部关闭,写管道进程终止
    • 管道读端没有被全部关闭
      • 管道已满,write阻塞
      • 管道未满,写入数据,并返回实际写入的字节数
posted @ 2023-02-09 14:57  小秦同学在上学  阅读(35)  评论(0编辑  收藏  举报