【问题标题】:Infinite read(2) with piped command使用管道命令进行无限读取(2)
【发布时间】:2024-07-02 15:35:02
【问题描述】:

我想对 Linux 系统上的 read(2) 行为有一定的了解, 我正在尝试制作外壳,但在阅读输入时遇到问题。 我做类似的事情

read(0, BUF, 4096);

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

echo ls | bash

Bash 只会执行 ls 一次,但当我执行此操作时,读取总是返回相同的缓冲区,“ls” 所以它进入无限循环。 我想知道为什么 read(2) 没有返回 0,谢谢。

【问题讨论】:

    标签: c bash shell unix


    【解决方案1】:

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

    read(0, BUF, 4096);
    

    你需要写:

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

    然后检查bytes_read是否为零。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        最近更新 更多