有名管道(二)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/isunbin/article/details/84573842

一、从FIFO中读取数据:

约定:如果一个进程为了从FIFO中读取数据而以阻塞的方式打开FIFO,则称内核为该进程的读操作设置了阻塞标志。

  • 如果有进程为写而打开FIIF(写端存在),且当前FIFO内没有数据,则对于设置了阻塞标志的读操作来说,将一直阻塞,对于没有设置阻塞标志读操作来说返回-1,当前errno值为EAGAIN提醒以后再试。
  • 对于设置阻塞标志的读操作来说,造成阻塞的原因有两种,当前FIFO内有数据,但其他进程正在读这些数据;另外FIFO内没有数据。解阻塞的原因则是FIFO中有新的数据写入,不论写入数据量的大小,也不论读操作请求多少数据量。
  • 如果没有进程写打开FIFO,则设置了阻塞标志的读操作会阻塞。
  • 如果写端关闭,管道中有数据读取管道中的数据,如果管道没有数据读端将不会继续阻塞,此时返回0。(注意:如果FIFO有数据,则设置了阻塞标志的读操作来说不会因为FIFO的字节数小于请求读的字节数而阻塞,读操作会返回FIFO现有的数据量。)

 

二、向FIFO中写入数据

约定:如果一个进程为了向FIFO中写入数据而阻塞打开FIFO,那么称该进程内的写操作设置了阻塞标志。

1. 对于设置了阻塞标志的写操作:

  • 当写入数据量不大于PIPE_BUF时,linux将保证写入的原子性,如果此时管道空闲缓冲区不足以容纳要写入的字节数,则进入睡眠,直到缓冲区中能够写入的字节数,才开始进行一次性写操作。
  • 当要写入的数据量大于PIPE_BUF时,Linux将不再保证写入的原子性。FIFO缓冲区一有空闲,写进程就会试图向管道写入数据,写操作在写完所有请求写的数据后返回。

2. 对于没有设置阻塞标志的写操作:

  • 当要写入的数据量大于PIPE_BUF时,Linux将不再保证写入的原子性。在写满所有FIFO空闲缓冲区后,写操作返回。
  • 当要写入的数据量不大于PIPE_BUF时,linux将保证写入的原子性,如果当前FIFO空闲缓冲区能够容纳写入的字节数,写完成功返回;如果当前FIFO空闲缓冲区不能容纳请求写入的字节数,则返回EANGIN错误,提醒以后再写。

猜你喜欢

转载自blog.csdn.net/isunbin/article/details/84573842