質問

私の理解では、open() を使用して新しいファイルを開くときに OS によって割り当てられるファイル記述子 (整数) を制御できないということでした。それでは、bash シェルで次のようなコマンドを使用して特定のファイル記述子を割り当てることはどのように可能ですか?

exec 5>&1

(bash ソースを読めばわかると思います...)

役に立ちましたか?

解決

ファイル記述子がすでに使用されている場合があるということは正しいと思います。これは~からもらいました http://tldp.org/LDP/abs/html/io-redirection.html#FTN.AEN17716

「ファイル記述子 5 を使用すると問題が発生する可能性があります。Bash が子プロセスを作成すると、exec と同様に、子プロセスは fd 5 を継承します (Chet Ramey のアーカイブされた電子メールを参照してください)。 主題:RE:ファイル記述子 5 は開いたままになります)。この特定の fd は放っておくのが最善です。」

これに対する解決策は、bash マニュアルのセクション 3.6 段落 2 に指定されています。

ファイル記述子番号が先行する可能性のある各リダイレクトは、代わりにフォームの単語が先行する場合があります {varname}. 。この場合、>& - <& - を除く各リダイレクト演算子について、シェルは10を超えるファイル記述子を割り当て、{varname}に割り当てます。>&- または <&- の前に {varname} が付いている場合、varname の値は閉じるファイル記述子を定義します。

例えば

#!/bin/bash

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

他のヒント

dup2ののUnixシステムコールを参照してください。

また、ファイルディスクリプタは、あなたが知っているそうだとすれば、順次割り当てられた0、1、2、...、nはすでに開かれ、それらのどれもがクローズされていない、次は、n + 1。

となります
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top