管道PIPE_BUF说明

管道PIPE_BUF说明

    FIFO被称为命名管道。PIPE也是管道。由于pipe和FIFO本质上都是管道,不同点就是创建方式不一样、FIFO多个进程使用(可以没有共同祖先)、FIFO多个进程通信。因此,FIFO的测试demo就不多介绍了。本博客主要记录管道的PIPE_BUF,即管道的缓存大小。


PIPE——BUF

    POSIX.1规定当写入管道的长度小于PIPE_BUF字节时必须是原子的:即写入数据作为连续序列写入管道。 超过PIPE_BUF字节的写入可能是非原子的:内核可能会将数据与其他进程写入的数据交错。 POSIX.1要求PIPE_BUF至少为512字节。(在Linux上,PIPE_BUF为4096字节)。在实践中取决于文件描述符是否为非阻塞(O_NONBLOCK),管道中是否有多个写入器,以及n要写入的字节数:


情况1:O_NONBLOCK disabled, n <= PIPE_BUF

    所有n个字节都以原子方式写入; write可能会阻止如果没有空间来立即写入n个字节。

情况2:O_NONBLOCK enabled, n <= PIPE_BUF

    如果有空间向管道写入n个字节,则立即write成功,写入全部n个字节; 否则失败,并将errno设置为EAGAIN。

情况3:O_NONBLOCK disabled, n > PIPE_BUF
    写入是非原子化的:write的数据可能会被写入(2)与其他进程交错; write阻塞,直到写入了n个字节。

情况4:O_NONBLOCK enabled, n > PIPE_BUF
    如果管道已满,则写入(2)失败,并将errno设置为EAGAIN。 否则,可能会写入1到n个字节(即可能发生“部分写入”;调用者应该检查write(2)的返回值以查看实际写入的字节数),并且可以将这些字节与其他进程写入。


在Linux上查看PIPE_BUF限制

使用linux的ulimit -a来查看系统限制:

core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 3777
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 3777
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
可以看到在linux系统上pipe size 为512bytes * 8= 4096bytes。



参考资料

[1].http://man7.org/linux/man-pages/man7/pipe.7.html







你可能感兴趣的:(管道PIPE_BUF说明)