Exec全体のファイル記述子

Exec全体のファイル記述子

デフォルトでは、ファイル記述子はexec関数で開いたままです。記述子0-2の場合、この利点を理解できます。しかし、他の記述子を開いたままにする実際のユースケースはありますか?この事実に依存する実際的な適用はありますか?

ベストアンサー1

実行されたコマンドにfdを渡したくない場合は、ファイル記述子にフラグを設定できます(open():O_CLOEXEC以降:FD_CLOEXEC)。fcntl()

コマンドを実行するには、内部ファイル記述子を使用して実行する必要があります。

たとえば、シェルは次のことをksh93行います。exec 3< some-file別のシェルまたはfdを使用して開いた場合は、fd:を望ましくない、またはアクセスしたくない場合は手動{ cmd1; cmd2; } 3< fileで閉じる必要があります。cmd1cmd2{cmd1 3<&-; cmd2; } 3< fileこれは良い習慣ですが、一般的に従わなくても問題にならないので、常に従うわけではありません。

さて、この機能は役に立ちますか?はい、いくつかのコマンドがそれに依存します。

一部のコマンドは、呼び出し元が開いたファイル記述子を引数として使用します。心に浮かぶいくつかの例は次のとおりです。

  • xtermそしてその-Sオプション
  • qemuいろいろな仕事のために
  • flock(送信者fdのファイルをロックします)
  • コマンドはオプションtestとも呼ばれます(最近、ほとんどのBourneに似たシェルにはユーティリティが組み込まれていますが、まだ実行できるコマンドがあります)。[-ttesttest
  • dialogユーザー入力、ユーザー出力とエラー、呼び出し元の入力と出力にはファイル記述子が必要なため、追加のfdを使用できます。
  • gpgあるいは、opensslパスワードなどの情報を渡すためにファイル記述子を指定することもできます。

たくさんあります助ける人ユーティリティ(例:実装するそれはおそらく、それに依存するsetuid / setgid実行可能ファイルを使用して他のユーザーまたはグループで実行されるコマンドの一部です。

プロセスの交換はそれに依存します。

では、diff <(cmd1) <(cmd2)2つのファイル記述子(パイプ用)がdiffに渡され、diff引数として渡された特殊な/ dev / fd / nを介してそれらを開いてアクセスします。

プロセスの交換がないシェルの場合は、以下を手動で実行できます。

cm1 | { cmd2 | diff /dev/fd/3 -; } 3<&0

おすすめ記事