【问题标题】:C restore stdin to the actual standard input after using dup2C使用dup2后将stdin恢复为实际标准输入
【发布时间】:2021-12-05 19:19:02
【问题描述】:

我将如何使标准输入的 fd 返回其原始“文件目标”?这可以通过最初的分叉、使用子进程执行我需要的操作然后杀死那个子进程、让我带着原始文件描述符回到父进程来完成吗?父母和孩子之间是否主动共享文件描述符?

【问题讨论】:

  • 问题多,代码少。
  • 不积极。在 fork() 处,子级具有与其父级相同的文件描述符,绑定到相同的资源,但如果子级(分别是父级)在文件描述符上使用 dup2(),则父级(分别是子级)不会自动执行相同的重定向(close()...也是如此)。

标签: c dup


【解决方案1】:

那会奏效。更改子项的标准输入对父项没有影响。

只要 fds 引用同一个流,文件位置之类的东西就会被共享,因为这是流的属性。但是重新打开它或复制它会将描述符与不同的流相关联。

【讨论】:

  • 更改子级的标准输入对父级没有影响。 It actually can in POSIX systems,因为父级和子级仍将共享相同的底层文件描述我>。因此lseek()read()/write() 等调用可以改变多个文件描述符 的位置。我现在找不到任何链接 fseek()lseek() 的东西,所以它是开放的,改变文件 description 的状态如何影响 stream 的状态通过另一个 descriptor 共享 description
  • @Andrew Henle 答案已经这么说了。
  • 根据我的经验,不理解 POSIX dup()'d 文件描述符的方式仍然引用同一文件 description 的人会读作“复制到它会关联具有不同流的描述符”并惊讶地发现两个不同的文件 描述符 将共享状态。考虑到 POSIX 需要 14 个段落和一个很长的项目符号列表来描述流、文件描述符和文件描述之间的交互,我认为对于新程序员来说太容易搞砸了。 (是的,我很久以前就有点坏了……)
猜你喜欢
  • 2019-05-24
  • 1970-01-01
  • 2010-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多