【发布时间】:2021-01-12 16:32:46
【问题描述】:
我希望我的程序从命令行选项或标准输入(重定向)读取数据。那么如何检查stdin是否为空呢?
如果stdin 为空(等待输入),则执行fgetc 会挂起我的程序。调用 feof 返回 false。
也试过了
ioctl(0, I_NREAD, &n) == 0 && n > 0
但我没有定义 I_NREAD(在 Raspi 上,但我想要便携)。
如何实现?
【问题讨论】:
-
没有这个概念。
stdin只是一个流,或者您处于流的末尾(当它关闭时会发生这种情况 - 例如,如果您按 ctrl-D 或如果您从文件重定向标准输入)。如果你想处理终端对象(不是stdin),你必须放弃标准输入并为此使用适当的API(打开控制终端设备/dev/tty)。 -
所以写程序是不可能的,感觉是不是被重定向喂了?
-
它总是被重定向。当您直接与其交互时,它(通常)从 pty 重定向。您可以通过
isatty(STDIN_FILENO)进行检查。 -
我不知道这是否与您相关,但规范的 unix 工具会反过来:在命令行上查找参数,如果没有提供输入,则使用
stdin在争论中。例如cat foo将读取foo,但cat将从标准输入读取。 -
就像spectras 所说的,Unix 命令行工具在缺少任何要处理的文件时会查找标准输入。但除此之外,他们通常将单个减号视为标准输入的文件名。因此,如果您输入
cat -,您将得到与cat相同的结果