【问题标题】:specifying file descriptor number?指定文件描述符编号?
【发布时间】:2011-03-26 09:33:35
【问题描述】:

我的理解是,在使用 open() 打开新文件时,无法控制操作系统分配的文件描述符(整数)。那么如何在 bash shell 中使用类似的命令来分配特定的文件描述符

exec 5>&1

(我想我可以通过阅读 bash 源代码找到...)

【问题讨论】:

    标签: c linux bash unix file-descriptor


    【解决方案1】:

    我相信你是对的,有时文件描述符可能已经在使用中。我是从http://tldp.org/LDP/abs/html/io-redirection.html#FTN.AEN17716得到这个的

    “使用文件描述符 5 可能会导致问题。当 Bash 创建子进程时,与 exec 一样,子进程继承 fd 5(请参阅 Chet Ramey 的存档电子邮件,SUBJECT: RE: File descriptor 5 is held open)。最好不要管这个特定的 fd。”

    对此的解决方案在 bash 手册的第 3.6 节第 2 段中指定。

    每个可能以文件描述符编号开头的重定向可能会改为 前面是 {varname} 形式的单词。在这种情况下,对于每个重定向运算符 除了 >&- 和 &- 或

    例如

    #!/bin/bash
    
    exec {NEW_STDOUT}>&1
    echo "Hello" >&$NEW_STDOUT
    exec {NEW_STDOUT}>&-
    

    【讨论】:

      【解决方案2】:

      查看dup2 Unix 系统调用。

      【讨论】:

      • 这解释了我如何将 2 复制到 5,但我如何知道 5 可用?如果它已经在使用怎么办?
      • opengroup.org/onlinepubs/9699919799/functions/dup.html If fildes2 is already a valid open file descriptor, it shall be closed first, unless fildes is equal to fildes2 in which case dup2() shall return fildes2 without closing it.
      【解决方案3】:

      另外,文件描述符是按顺序分配的,所以如果你知道 0、1、2、...、n 已经打开并且没有一个被关闭,那么下一个将是 n+1。

      【讨论】:

      • 很好,但是 bash 如何确定 5 尚未打开? (如果是,exec 会做什么?)
      • Bash 可能使用dup2。并且当它派生一个子进程运行命令时要小心不要打开随机文件描述符。
      • @c-urchin:如果你还没有打开5,它不太可能会被使用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-07
      • 2011-09-26
      • 1970-01-01
      • 2018-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多