【问题标题】:Getting file handle as an argument获取文件句柄作为参数
【发布时间】:2017-04-26 05:44:37
【问题描述】:

在 bash 重定向中,我问了一个question,得到的答案如下。

使用cat < filecat 从其标准输入读取; shell打开文件并将文件句柄连接到cat

现在,我很好奇这怎么可能。我的意思是,程序(由 C 或 C++ 实现)如何获取文件句柄作为参数。我知道只有字符(例如char* argc[])可以作为参数。

【问题讨论】:

  • 它不通过命令行参数执行此操作。当您的进程运行时,它会更改 stdin 获取其输入的位置。

标签: c++ bash filehandle


【解决方案1】:

它并没有真正将其作为参数(至少不是命令行参数)。

当一个进程启动时(在类 UNIX 系统上),它会打开三个标准流:标准输入、标准输出和标准错误。如果你不重定向任何东西,标准输入将来自键盘,标准输出和标准错误都会出现在屏幕上(通过某些设备连接,例如/dev)。

当您重定向标准流(输入、输出或错误)时,shell 会打开该文件的句柄,然后进行必要的操作以将其设置为子级的指定标准流——例如,在系统上使用fork,它可以使用dup2为指定文件设置自己的标准句柄,然后fork子进程,然后(在父进程中)恢复其标准流(这不是处理它的唯一可能方法,只是一种可能性)。

【讨论】:

    【解决方案2】:

    < 字符表示输入流从stdin 重定向到file。该程序没有将文件句柄作为参数,但stdin 句柄被命令行中提供的file 句柄替换。见Redirection on Wikipedia的描述

    【讨论】:

      【解决方案3】:

      <file不是参数。

      <(同样>>>|重定向符号,它们的行为直接嵌入在bash(以及其他shell)中。

      重定向意味着程序从/到文件读取/写入而不是标准输入/输出(键盘和显示器) (<>>>),或者 - 在 | 的情况下 - 左侧程序的输出作为输入传递给右侧程序。

      (假设相应的程序 - 在您的情况下为 cat - 被编程为从标准输入/输出读取/写入。对于程序员来说,这是一种非常方便的方式,因为他/她不需要关心文件及其处理程序。)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-07-24
        • 1970-01-01
        • 2011-03-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-22
        相关资源
        最近更新 更多