Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 指定文件描述符编号?_C_Linux_Bash_Unix_File Descriptor - Fatal编程技术网

C 指定文件描述符编号?

C 指定文件描述符编号?,c,linux,bash,unix,file-descriptor,C,Linux,Bash,Unix,File Descriptor,我的理解是,在使用open()打开新文件时,无法控制操作系统分配的文件描述符(整数)。那么,在bashshell中,如何使用如下命令分配特定的文件描述符 exec 5>&1 (我想我可以通过阅读bash源代码找到答案…查看Unix系统调用。此外,文件描述符是按顺序分配的,因此如果您知道0、1、2、…、n已经打开,并且没有一个已经关闭,那么下一个将是n+1。我相信您是对的,有时文件描述符可能已经在使用。这是我从你那里得到的 “使用文件描述符5可能会导致问题。当Bash创建子进程时,

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

exec 5>&1

(我想我可以通过阅读bash源代码找到答案…

查看Unix系统调用。

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

我相信您是对的,有时文件描述符可能已经在使用。这是我从你那里得到的

“使用文件描述符5可能会导致问题。当Bash创建子进程时,就像使用exec一样,子进程继承fd 5(请参阅Chet Ramey的存档电子邮件,)。最好不要使用此特定fd。”

bash手册第3.6节第2段规定了解决方案

每个重定向之前可能有一个文件描述符编号,但可以改为 前面有一个
{varname}
形式的单词。在这种情况下,对于每个重定向操作符
除了>&-和&-或者这解释了如何将2复制到5,但是我如何知道5是可用的?如果它已经在使用中呢
如果fildes2已经是有效的打开文件描述符,则应首先关闭它,除非fildes等于fildes2,在这种情况下,dup2()将返回fildes2而不关闭它。
好,但是bash如何确定5尚未打开?(如果是,exec会做什么?)Bash可能使用
dup2
。当它派生一个子进程来运行命令时,小心不要打开随机文件描述符。@c-urchin:如果你还没有打开5,它就不太可能被使用。
#!/bin/bash

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