【发布时间】:2011-03-26 09:33:35
【问题描述】:
我的理解是,在使用 open() 打开新文件时,无法控制操作系统分配的文件描述符(整数)。那么如何在 bash shell 中使用类似的命令来分配特定的文件描述符
exec 5>&1
(我想我可以通过阅读 bash 源代码找到...)
【问题讨论】:
标签: c linux bash unix file-descriptor
我的理解是,在使用 open() 打开新文件时,无法控制操作系统分配的文件描述符(整数)。那么如何在 bash shell 中使用类似的命令来分配特定的文件描述符
exec 5>&1
(我想我可以通过阅读 bash 源代码找到...)
【问题讨论】:
标签: c linux bash unix file-descriptor
我相信你是对的,有时文件描述符可能已经在使用中。我是从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}>&-
【讨论】:
查看dup2 Unix 系统调用。
【讨论】:
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.
另外,文件描述符是按顺序分配的,所以如果你知道 0、1、2、...、n 已经打开并且没有一个被关闭,那么下一个将是 n+1。
【讨论】:
dup2。并且当它派生一个子进程运行命令时要小心不要打开随机文件描述符。