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

问题描述 投票:0回答:2

我想对 Linux 系统上的

read(2)
行为有一些精确的了解。我正在尝试制作一个外壳,但在读取输入时遇到问题。我做了类似的事情

read(0, BUF, 4096);

所以事情是在 bash(和大多数 shell)上,你可以像这样通过管道传输命令:

echo ls | bash

Bash 只会执行

ls
一次,但是当我执行此读取时,总是返回相同的缓冲区,
"ls"
,因此它会进入无限循环。 我想知道为什么
read(2)
不给我回复 0 谢谢。

c bash shell unix
2个回答
3
投票

您需要检查

read
的返回值。如果返回 0,则表示已到达输入流的末尾。也就是说,而不是这个:

read(0, BUF, 4096);

你需要写:

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

然后检查

bytes_read
是否为零。


1
投票

每次读取后您可能没有清除缓冲区。如果没有任何内容可读取,

read()
将返回 0 且不向缓冲区写入任何内容。如果缓冲区没有被清除,之前的内容仍然会在那里,这就是为什么你不断得到无限
ls
- 那里仍然只有原始的
ls
,但你继续将其视为新输入。

© www.soinside.com 2019 - 2024. All rights reserved.