我希望在Linux系统上有一些关于read(2)行为的精确度, 我试图制作一个shell,我在阅读输入时遇到了问题。 我喜欢
read(0, BUF, 4096);
所以事情是在bash(和大多数shell)你可以管道这样的命令:
echo ls | bash
Bash只执行ls一次,但是当我这样做时,read总是返回相同的缓冲区," ls" 所以它进入无限循环。 我想知道为什么读(2)没有回报我0谢谢你。
答案 0 :(得分:3)
您需要检查read
的返回值。如果它返回0,则它到达输入流的末尾。也就是说,而不是:
read(0, BUF, 4096);
你需要写:
int bytes_read = read(0, BUF, 4096);
然后检查bytes_read
是否为零。
答案 1 :(得分:1)
每次读取后,您可能没有清除缓冲区。如果没有什么可读的,read()
将返回0并且不向缓冲区写任何内容。如果缓冲区没有被清除,那么手中的任何东西仍然存在,这就是为什么你不断获得无限ls
- 那里仍然只有原始的ls
,但你一直把它当作新的投入。