我听说对于命名管道,小于约 512 字节的写入是原子的(写入不会交错)。
有没有办法增加特定命名管道的数量?
就像是:
mkfifo mynamedpipe --buf=2500
Run Code Online (Sandbox Code Playgroud)
据说这是完整的文档:http : //www.gnu.org/software/coreutils/manual/html_node/mkfifo-invocation.html#mkfifo-invocation
man mkfifo
带我到那个页面。
Sté*_*las 11
fifo
文件只是一种文件类型,当它被打开用于读取和写入时,会像 pipe() 系统调用一样实例化管道。
至少在 Linux 上,通过该管道传输的数据根本不存储在文件系统中(仅在内核中作为内核内存)。并且fifo文件的size属性无关,始终为0。
在Linux上,你可以改变一个缓冲管(即管是否已被实例化的大小pipe()
或通过打开一个FIFO文件)用F_SETPIPE_SZ
fcntl()
,但对于非特权用户,这是由约束/proc/sys/fs/pipe-max-size
。管道的任何作者或读者都可以发出该消息,fcntl()
尽管作者这样做更有意义。在命名管道的情况下,您需要为通过 fifo 文件实例化的每个管道执行此操作。
$ mkfifo fifo
$ exec 3<> fifo # instantiate the pipe
$ seq 20000 > fifo
^C # seq hangs because it's trying to write more than 64KiB
$ exec 3<&- 3<> fifo # close the first pipe and instantiate a new one
$ (perl -MFcntl -e 'fcntl(STDOUT, 1031, 1048576)'; seq 20000) > fifo
$ # went through this time
Run Code Online (Sandbox Code Playgroud)
上面,我曾经perl
发出fcntl()
, 对F_SETPIPE_SZ
(1031 在我的系统上)的值进行编码。