进程间通讯——管道(有名管道)



     前几天我们简单的介绍了进程间通讯的一种渠道——管道,我们有说道管道的概念,管道的通讯原理,还提到了管道的两种类型:有名管道和无名管道,今天我们就来说说有名管道吧

     基本概念:

有名管道在文件目录中有一个文件标示(管道文件)。实际不占据磁盘空间。数据缓存在内存上(只有使用时内存才开辟,由于在内存上,因此管道文件的属性中所占空间大小为0字节;当两个进程间一读一写完成后,管道文件也立即在内存清空

 进程间通讯——管道(有名管道)

 FIFO为管道文件

  • 管道的操作:

  • 创建:  命令方式:mkfifo  函数方式:mkfifo();

  • 打开:  open(char *path , int flag);

  • 读数据: read(int fd , char *buff , intsize);

定义一个buff,将fd里的数据读入buff里;

  • 写数据: write(int fd ,char *buff ,int size)

              定义一个buff,将buff里的数据写入fd

  • 关闭:  close(int fd);

 

  • 阻塞运行函数:

    函数调用以后并不会立即返回,需要等待某些条件的发生才会返回

   Openreadwrite函数在操作文件时不会阻塞,但在操作管道文件时会出现阻塞

   

  • Open:如果一个进程以只写的方式打开一个文件时,open函数就会阻塞,直到另一个进程以只读的方式打开管道文件时open才会返回,进程才会接着执行;如果一个进程以只读的方式打开一个文件时,open函数就会阻塞,直到另一个进程以只写的方式打开管道文件时open才会返回,进程才会接着执行;

  • Readread也会阻塞,直到写入数据或者所有写端都关闭才不会阻塞,read读写数据后会将内存上的已读数据清空;

  • Write:当管道满的时候就会阻塞