根据 POSIX标准中 cat
的定义:
通过禁用输出缓冲,可以实现该操作。SYNOPSIS
cat [-u] [file...]
...
OPTIONS
...
The following option shall be supported:
-u Write bytes from the input file to the standard output without delay as each is read.
选项-u
禁用了对stdout
的缓冲。
GNU文档如下:
为标准输出使用无缓冲I/O。如果没有此选项,Posix没有指定其行为。
这可能表示当前cat
的默认行为是无缓冲输出。
这是Unix/Linux的POSIX兼容选项。
GNU cat
会自动执行此操作,没有关闭的方法。当指定了此选项时,它会被接受但被忽略,因为它对行为没有影响。
更多详细信息请参见cat(1)
:
-u
从输入文件中读取每个字节并立即写入标准输出,没有延迟。
cat -u
的概念确实是要输出无缓冲,这样即使 cat
在管道中使用时,数据也会在读取时立即写入。cat -u "$@" | …
且输入来自键盘时,这一点就很重要了。cat
很可能没有缓冲(使用直接的 read()
和 write()
调用),所以 -u
选项是无关紧要的——它总是在“无缓冲模式”下工作。-u
选项在原型非阻塞读取FIFOs
时很有价值。其目的是支持以下序列:
mkfifo foo>
cat -u foo > /dev/tty13 &
cat -u > foo在默认情况下,标准输出是否缓冲未指定。这在标准输出与终端相关联时有时很重要,因为缓冲可能会延迟输出。-u选项的存在保证了无缓冲I/O可用。如果未指定-u选项,则实现定义cat实用程序是否缓冲输出。传统上,-u选项使用IEEE Std 1003.1-2001的系统接口卷中定义的setvbuf()函数的等效实现。
SuperUser
或Unix and Linux
堆栈交换网站上比在SO上更加幸运。 - AntonHsetbuf
的作用会有所帮助:http://en.cppreference.com/w/c/io/setbuf。 - WhozCraig