我想对 Linux 系统上的
read(2)
行为有一些精确的了解。我正在尝试制作一个外壳,但在读取输入时遇到问题。我做了类似的事情
read(0, BUF, 4096);
所以事情是在 bash(和大多数 shell)上,你可以像这样通过管道传输命令:
echo ls | bash
Bash 只会执行
ls
一次,但是当我执行此读取时,总是返回相同的缓冲区,"ls"
,因此它会进入无限循环。
我想知道为什么 read(2)
不给我回复 0 谢谢。
read
的返回值。如果返回 0,则表示已到达输入流的末尾。也就是说,而不是这个:
read(0, BUF, 4096);
你需要写:
int bytes_read = read(0, BUF, 4096);
然后检查
bytes_read
是否为零。
每次读取后您可能没有清除缓冲区。如果没有任何内容可读取,
read()
将返回 0 且不向缓冲区写入任何内容。如果缓冲区没有被清除,之前的内容仍然会在那里,这就是为什么你不断得到无限ls
- 那里仍然只有原始的ls
,但你继续将其视为新输入。