小编Pet*_*los的帖子

传输 16K 字节后 Ksh 丢失数据

我最近发现,如果 ksh 被阻塞几秒钟,则在向 stdout 打印超过 16K 字节后可能会丢失一些数据。

test.sh脚本打印出 257*64 (16448) 个字节:

#!/usr/bin/ksh
i=0
while [[ i -lt 257 ]]
do
    x=$(file /tmp)
    echo "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDE"
    i=$((i+1))
done |
while read datafile
do
    echo $datafile
done
Run Code Online (Sandbox Code Playgroud)

我进行了以下测试:

0 $ ./test.sh | wc -c
   16448
0 $ ./test.sh | (sleep 3; wc -c)
   16384
Run Code Online (Sandbox Code Playgroud)

该行x=$(file /tmp)似乎会影响此行为,尽管它不会将任何内容通过管道传输到第二个循环。

如果我使用 bash,它会按预期工作。

在我看来,ksh 是一个错误。我正在使用 Solaris 5.10。是否有解决方案或解决方法?这个问题的根本原因是什么?我想这可能与管道缓冲区大小有关。

谢谢,彼得

编辑:

因此,使用 运行测试truss,我可以看到写入最后 64 个字节时出错:

ioctl(0, I_PEEK, 0x08046B40)                    = 0
    Received signal #18, SIGCLD, …
Run Code Online (Sandbox Code Playgroud)

solaris ksh pipe buffer stdout

7
推荐指数
1
解决办法
1194
查看次数

标签 统计

buffer ×1

ksh ×1

pipe ×1

solaris ×1

stdout ×1