指定文件描述符号码是什么意思?

8

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

exec 5>&1

(我想我可以通过阅读bash源代码找出答案...)
3个回答

5
我相信你是对的,有时文件描述符可能已经被使用了。我从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}>&-

3

请参考 Unix 系统调用 dup2


这解释了我如何将2复制到5,但是我怎么知道5是否可用?如果它已经在使用中怎么办? - c-urchin
3
如果fildes2已经是一个有效的打开文件描述符,则在进行复制之前,它必须先被关闭,除非fildes等于fildes2,在这种情况下dup2()将返回fildes2并保持其打开状态。 - R.. GitHub STOP HELPING ICE

1
此外,文件描述符是按顺序分配的,因此如果您知道0、1、2、...、n已经打开且没有关闭,下一个将是n+1。

1
好的,但是bash如何确定5没有被打开?(如果已经打开了5,exec会怎么做?) - c-urchin
Bash 可能使用 dup2。并且在它fork子进程来运行命令时,小心不要有任意文件描述符打开。 - R.. GitHub STOP HELPING ICE
@c-urchin:如果您没有打开5,那么它很可能没有被使用。 - bstpierre

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接