【问题标题】:Is possible opening stdin after close(0)? [duplicate]关闭(0)后是否​​可以打开标准输入? [复制]
【发布时间】:2017-01-26 15:14:27
【问题描述】:

我有一个问题,学习标准 I/O。

    #include <stdio.h>
    int main(){
    void *mem = malloc(0x80);
    close(0)
     /*
      something code (solution)
   */
    read(0,mem,0x80);
    }

使用上面的代码,可以打开 stdin 吗? 在就 stackoverflow 提问之前,我认为 open('/dev/tty'); . 但它似乎没有完全打开标准输入。 我希望不要使用 dup()

【问题讨论】:

  • 想象stdin_fileno 实际上是磁盘上文件的FD,它是最后一个这样的FD。关闭它后,该文件可能会被删除。所以原则上你绝对没有办法恢复指向同一个文件的封闭FD。当然,您可以将 FD 0 重新打开到 new 文件。
  • @KerrekSB 那么,如何在程序启动时创建标准输入?
  • @오우진:你有什么理由避免使用dupdup2
  • @BasileStarynkevitch 我想知道创建标准输入的实际原理。
  • @오우진:你没有。 FD已经打开。父进程通常会提供它们。

标签: c linux io


【解决方案1】:

在我看来,实现这一目标的理想方法是

  • 使用dup() 创建备份fd
  • close()stdin
  • 执行操作
  • 使用dup2() 恢复stdin 并传递以前的备份fd

【讨论】:

  • 就没有别的办法了吗?如果可能的话,最好不要使用 dup()
猜你喜欢
  • 2018-02-21
  • 2016-11-14
  • 2012-02-23
  • 1970-01-01
  • 1970-01-01
  • 2018-08-29
  • 1970-01-01
  • 1970-01-01
  • 2013-04-12
相关资源
最近更新 更多