首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Unix/Linux cat x y>y:我对处理的理解正确吗?

Unix/Linux cat x y>y:我对处理的理解正确吗?
EN

Stack Overflow用户
提问于 2015-10-23 20:44:32
回答 1查看 2.2K关注 0票数 1

我目前正在阅读Kernighan和Pike的优秀著作“UNIX编程环境”。他们给出的一个有趣的例子(练习3-7)是命令

代码语言:javascript
复制
cat x y > y

我试着运行这个命令,文件的初始内容是x包含xxxy包含yyy

命令未完成。x保持不变(正如您预期的那样),y最终得到了大量的xxx行。

我就是这样把行为合理化的:

  1. >重定向操作符所做的第一件事是截断y,以便接收重定向数据。因此,在yyy中没有y字节。
  2. 当重定向进程开始写入数据时,y是空的,所以cat x y (最初)的输出只是xxx
  3. cat在到达y上的EOF之前不会停止编写。但是它永远不会到达EOF,因为当每个写操作完成时,它会将EOF进一步推过当前的读/写指针?因此,cat无限期地将y附加到自己身上。

如果有人能对这种行为提供更清晰的解释,或者纠正我,如果这完全是垃圾,那将是非常感谢的。

另外,我确信我曾经在网上找到了一套有效的解决方案来解决教科书中的问题,但现在我找不到了。如果有人能指给我看,那就太好了。

非常感谢,

MB

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-23 20:57:12

是的,你现有的理解是正确的。

要查看实际的系统(来自strace busybox cat x y >y,以避免GNU版本检测和终止此类循环的尝试):

代码语言:javascript
复制
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可用于读取,此时额外的内容立即可用于读取,因此循环继续进行。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33311104

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档