我目前正在阅读Kernighan和Pike的优秀著作“UNIX编程环境”。他们给出的一个有趣的例子(练习3-7)是命令
cat x y > y我试着运行这个命令,文件的初始内容是x包含xxx,y包含yyy
命令未完成。x保持不变(正如您预期的那样),y最终得到了大量的xxx行。
我就是这样把行为合理化的:
>重定向操作符所做的第一件事是截断y,以便接收重定向数据。因此,在yyy中没有y字节。y是空的,所以cat x y (最初)的输出只是xxx。cat在到达y上的EOF之前不会停止编写。但是它永远不会到达EOF,因为当每个写操作完成时,它会将EOF进一步推过当前的读/写指针?因此,cat无限期地将y附加到自己身上。如果有人能对这种行为提供更清晰的解释,或者纠正我,如果这完全是垃圾,那将是非常感谢的。
另外,我确信我曾经在网上找到了一套有效的解决方案来解决教科书中的问题,但现在我找不到了。如果有人能指给我看,那就太好了。
非常感谢,
MB
发布于 2015-10-23 20:57:12
是的,你现有的理解是正确的。
要查看实际的系统(来自strace busybox cat x y >y,以避免GNU版本检测和终止此类循环的尝试):
open("x", O_RDONLY) = 3
read(3, "xxx\n", 4096) = 4
write(1, "xxx\n", 4) = 4
read(3, "", 4096) = 0
close(3) = 0
open("y", O_RDONLY) = 3
read(3, "xxx\n", 4096) = 4
write(1, "xxx\n", 4) = 4
read(3, "xxx\n", 4096) = 4
write(1, "xxx\n", 4) = 4...and最后两行重复无限。
未显示的是外壳的open("y", O_WRONLY|O_CREAT|O_TRUNC, 0666),它在fork()之后生成子进程,然后是exec的cat,但在cat的实际执行之前--因此,在上述所有操作之前。
因此,我们确切地看到了您的假设:在cat执行写入之前,只有一行xxx可用于读取,此时额外的内容立即可用于读取,因此循环继续进行。
https://stackoverflow.com/questions/33311104
复制相似问题