【问题标题】:redirection to multiple ttys in c重定向到c中的多个tty
【发布时间】:2013-12-25 16:25:39
【问题描述】:

我看到我可以做 freopen 将标准输出重定向到一个控制台到另一个 tty。我正在尝试将其重定向到包括控制台在内的多个终端。控制台是程序运行的地方。最好的方法是什么?

TIA

【问题讨论】:

    标签: c linux filesystems system


    【解决方案1】:

    您没有指定您使用的平台,但假设您可以找到要重定向到的 TTY 的文件路径,您可以在 stdout 文件描述符上调用 freopen。但是,这会关闭初始文件描述符,这听起来不像您想要的行为。一个文件描述符只能指向一个文件。

    最简单的 C 解决方案可能是 printf 的包装器,它在所有指定的文件上调用它。你也许可以用线程做一些事情,但这可能会使事情复杂化。

    如果您使用的是 *nix 系统,我建议使用 tee 来输出到标准输出和辅助文件。

    【讨论】:

    • 这听起来不错。实际上,我在玩弄复制标准输出 fd 的想法。然后 freopen,循环到数组中的每个 tys 并调用 printf。这是针对 linux 的。
    • 那么,无需重新发明轮子 - 将其发送至 tee。如果您希望它是可编写脚本的(./foo 而不是./foo | tee /dev/ttyA /Dev/ttyB...,您可以调用 fork、dup2 和 exec 来调用 tee。
    • 好吧,问题是这应该发生在 c 程序中。 tty 由来自客户端的用户设置和取消设置。
    • 那么听起来你最好的选择是为 printf 做一个包装器。在您的代码中,您将需要一种初始化每个文件句柄的方法,一个打印到每个文件句柄的函数,如果您想做得更好,还需要一个函数来关闭文件描述符。对于设置 TTY 的客户端,我不确定您的意思是什么,但是这将决定您的功能如何工作。
    【解决方案2】:

    没有像freopen 这样的简单方法。您需要一些包装器来接收输入并将其分别写入每个输出 tty。

    例如,tee 程序将其输入多路复用到标准输出和许多文件。例如,您可以在 C 中创建一个连接到tee /dev/ttyX /dev/ttyY ... 的管道。然后你可以用管道文件描述符替换标准输出,你会得到想要的行为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-15
      相关资源
      最近更新 更多