使用管道命令无限读取(2)

时间:2011-11-28 19:39:21

标签: c bash shell unix

我希望在Linux系统上有一些关于read(2)行为的精确度, 我试图制作一个shell,我在阅读输入时遇到了问题。 我喜欢

read(0, BUF, 4096);

所以事情是在bash(和大多数shell)你可以管道这样的命令:

echo ls | bash

Bash只执行ls一次,但是当我这样做时,read总是返回相同的缓冲区," ls" 所以它进入无限循环。 我想知道为什么读(2)没有回报我0谢谢你。

2 个答案:

答案 0 :(得分:3)

您需要检查read的返回值。如果它返回0,则它到达输入流的末尾。也就是说,而不是:

read(0, BUF, 4096);

你需要写:

int bytes_read = read(0, BUF, 4096);

然后检查bytes_read是否为零。

答案 1 :(得分:1)

每次读取后,您可能没有清除缓冲区。如果没有什么可读的,read()将返回0并且不向缓冲区写任何内容。如果缓冲区没有被清除,那么手中的任何东西仍然存在,这就是为什么你不断获得无限ls - 那里仍然只有原始的ls,但你一直把它当作新的投入。