llseek 调用 zcat all.tgz 时返回 ESPIPE | ./自行车运动员
我将 GNU tee
修改为 cycletee
源代码(您可以从https://github.com/vls/cycletee/tree/master/bin)
它的作用可以通过下面的例子来解释:
seq 10 | cycletee 1.txt 2.txt 3.txt
cat 1.txt // prints 1, 4, 7, 10
cat 2.txt // prints 2, 5, 8
cat 3.txt // prints 3, 6, 9
然后有一个 all.tgz< /code> (构建脚本参见附录)
all.tgz
包含三个文本文件,总共 9000000 行。
一切都很好。就像:
seq 10000000 | ./cycletee 1.txt 2.txt 3.txt
zcat all.tgz | tee 1.txt > /dev/null
zcat all.tgz | tail // got 9000000 at the last line
除了调用:
zcat all.tgz | ./cycletee 1.txt 2.txt 3.txt
当它读取到 No.3000000 行时,它退出。
strace it 我收到这条消息,它退出了:
_llseek(2, 0, 0xffbec3d0, SEEK_CUR) = -1 ESPIPE (Illegal seek)
问题
-
任何人都可以指出我的源代码有问题吗?
-
任何解决问题的调试技术都将受到赞赏。我不知道在这种情况下如何使用
gdb
。
附录
-
all.tgz
可以通过这个Python sciprt https://gist.github.com/1500742 -
环境:Ubuntu 10.04 32位、CentOS 5.4 64位
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
从来源来看:
我认为这不适用于二进制输入(包含 NUL 的输入)。
[鉴于 bytes_read 的符号,我强烈怀疑 fread() 已被 fgets() + strlen() 取代; ] 这可能是也可能不是 PIPE 错误的原因,但它看起来非常错误。
From the source:
I don't think this will work on binary input (input that contains NULs).
[ Given the signedness of bytes_read, I have the strong suspicion that fread() has been replaced by fgets() + strlen(); ] This may or may not be the cause of the PIPE error, but it looks very wrong.
您不能在管道或套接字上调用
llseek
或ftell
,它们不是可查找的文件。您可以使用像
gdb
这样的调试器(确实值得学习使用它;并且 GDB 非常好记录),例如在_llseek
上放置断点您也可以使用
strace
或ltrace
You cannot call
llseek
orftell
on a pipe or socket, they are not seekable files.You could use a debugger like
gdb
(it is really worth learning to use it; and GDB is very well documented), and e.g. put a breakpoint on_llseek
You could also use
strace
orltrace