【问题标题】:How to access the default stdin while using file redirection?使用文件重定向时如何访问默认标准输入?
【发布时间】:2009-06-30 20:30:47
【问题描述】:

我需要运行一个脚本并可以访问我程序中的默认标准输入(终端输入)。我可以做 ./program "script",通过程序打开和解析脚本,但我想让它成为 POSIX 风格,接受来自管道或重定向的输入。

我的意思是,由于我的程序是一个解析器,我可以运行 ./program,键入脚本并仍然使用标准输入(例如在 scanf 中)。但我想运行 ./program

我的程序是一个简化的 Pascal 解释器,这就是为什么我需要在我的脚本中运行 read(x)write(x)

是的,这是作业(解释器),但在头脑风暴过程中突然出现了疑问。

【问题讨论】:

    标签: c file posix stdin


    【解决方案1】:

    可以使用/dev/tty 访问当前控制终端,即使标准输入已被重定向。

    【讨论】:

    • 在不存在控制终端的情况下,最好补充一下打开 /dev/tty 会失败。两种常见情况是:进程是通过 cron 或 at 启动的。一般来说,从守护进程启动的进程本身就是守护进程,没有控制终端。
    【解决方案2】:

    ttyname(0) 将返回与标准输入关联的当前终端的文件名。然后您可以打开它并从中读取。

    【讨论】:

    • 好吧,我猜你每天都会学到一些新东西。 :) 尽管如此,看起来并不像人们经常想做的事情。 :)
    • 这并不常见,但我去年不得不用它来实现一个班级的“更多”程序。从文件读取输入,并将其输出到标准输出,但还必须从键盘读取输入以继续滚动。 :)
    • 你做了更多接受管道/重定向输入的事情吗?顺便说一句,ttyname(0) 会得到标准输入给我,但由于它被重定向,我不会得到终端,对吗?也许我可以使用返回的字符串来找出什么是标准输入...
    • /dev/tty/XXX 是设备本身,因此打开它将从实际设备获取输入。 stdin 只是 standard 输入流,通常是 /dev/tty/XXX,但在使用输入重定向时会更改为输入文件。
    • 所以 ttyname 上的 0 和 stdin 中的 0 不一样?实际上是0终端,总是当前终端?
    【解决方案3】:

    如果我理解您的要求,那么您要求的是在使用文件重定向时能够接收用户的交互式输入,例如上面的 ./program

    我不相信有办法做到这一点。 POSIX 系统将通过标准输入输入脚本,仅此而已。没有来自用户的交互。

    同样值得注意的是,您不必做任何特别的事情来实现这一点。像往常一样对待标准输入。您不必考虑它是交互输入还是来自文件,这真的很不错。

    【讨论】:

    • 最后一点,关于我已经知道的文件重定向,我真正想知道的是当前终端绑定的文件,正如mark4o所说的。
    猜你喜欢
    • 2022-11-10
    • 2020-12-09
    • 2014-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-04
    相关资源
    最近更新 更多