程序如何检测 stdin 输入的结束?

程序如何检测 stdin 输入的结束?

程序如何检测 stdin 输入的结束?

有多种方法可以向程序提供标准输入输入。

  1. 当使用here-document时,我们指定一个分隔符来表示stdin输入的结束:

    <<[−]word
    here-document
    delimiter
    

    为什么我们需要显式指定 stdin 输入的结尾?

  2. 当使用这里的字符串时,不需要额外的努力来表示标准输入的结束:

    <<< word
    

    程序如何知道 stdin 输入的结尾?

  3. 当使用从文件到 stdin 的重定向时,不需要额外的努力来表示 stdin 输入的结束。程序如何知道 stdin 输入的结尾?

  4. 当使用管道将另一个程序的 stdout 输出定向到该程序的 stdin 输入时,是否不需要额外的努力来表示 stdin 输入的结束?程序如何知道 stdin 输入的结尾?

  5. 在某些程序中,例如bc,每当您输入算术表达式并按回车键时,它都会将该表达式作为 stdin 输入并输出计算结果。在这种情况下,以 return 结尾的每一行是否被视为整个标准输入,或者从开始bc到退出键入的所有行是否bc被视为标准输入?

  6. 程序知道如何检测 stdin 输入结束的一般原理是什么?

    我们什么时候需要像 here-document 一样明确指定 stdin 输入的结束,什么时候不需要?

    它们是程序相关的还是程序无关的?

答案1

这取决于进程使用的特定系统调用;read(2)文件描述符上的 方法0在文件末尾返回,而流 I/O 可能会使用该feof(3)调用。可能有必要深入研究 ,strace以准确了解某些高级函数(如getline(3)或特定应用程序)在幕后正在做什么,但大多数事情可能会归结为read(2)feof(3)

在 shell 脚本中,heredoc 结束标签是完全可选的(尽管如果后续有其他代码,则这是必需的)。

相关内容