Cal*_*vin 1 parallel-processing bash buffer asynchronous pipe
考虑一下这个Bash代码:
(cmd1 & cmd2) | consumer
Run Code Online (Sandbox Code Playgroud)
consumer标准输入可能会出现什么样的情况?
cmd1,然后输出cmd2?cmd1任意点缀的线条来自cmd2?cmd1任意散布的字节来自cmd2?您可以期望看到随机交错的数据,但如果线条较短,则很可能在大多数情况下您会看到整行交错.
由于进程已stdout重定向到管道(不是交互式设备),因此输出可能是完全缓冲的.由于缓冲区在满时写入,可能与行的末尾不对应,您可能会看到交错缓冲区,每个缓冲区末尾都有混合行.
打开时,标准错误流未完全缓冲; 当且仅当可以确定流不参考交互设备时,标准输入和标准输出流被完全缓冲.
但是,不能保证整个缓冲区将以原子方式写入管道,因此可能存在其他交错效应.
这是一个快速测试:
$ (seq 100000 & seq 100000 &) | sort | uniq -c | awk '$1!=2' | wc -l
117
Run Code Online (Sandbox Code Playgroud)
该awk程序将打印其没有在组合输出中出现两次,这将包括所有混行的任何行.所以在那种情况下,大约一千行中的一行被混合在一起.
顺便说一下,(cmd1 & cmd2)只有cmd1在后台运行.尽管如此,它们仍然是相互异步的.
| 归档时间: |
|
| 查看次数: |
220 次 |
| 最近记录: |