指定文件描述符号?

时间:2010-08-06 15:02:07

标签: c linux bash unix file-descriptor

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

这样的命令来分配特定的文件描述符
exec 5>&1

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

3 个答案:

答案 0 :(得分:3)

请参阅dup2 Unix系统调用。

答案 1 :(得分:3)

我相信你是对的,有时文件描述符可能已经在使用中。我是从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}形式的单词。在这种情况下,对于每个重定向操作符   除了>& - 和<& - 之外,shell将分配大于10的文件描述符并将其分配给{varname}。如果>& - 或<& - 前面有{varname},则varname的值定义要关闭的文件描述符。

例如

#!/bin/bash

exec {NEW_STDOUT}>&1
echo "Hello" >&$NEW_STDOUT
exec {NEW_STDOUT}>&-

答案 2 :(得分:1)

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