stdin、stdout、stderr以外のファイル記述子をどのように取得しますか?

stdin、stdout、stderr以外のファイル記述子をどのように取得しますか?

私は、実行可能ファイルが出力を生成するときに出力を印刷してファイルにstdoutリダイレクトし、他のコマンドにパイプできるようにすることを好みます。

実行可能ファイルが通常2つの異なるファイルにリダイレクトされる2つの異なる出力を作成する必要があるとします。ファイル名を実行可能ファイルに渡すのを避け、ファイルに直接書きたいです。代わりに、次のようなものを書きたいです。

$ program 1>file_1 3>file_2

似たようなことができますか?

ベストアンサー1

できますが、良い考えではありません。通常、プログラムは3つのファイル記述子が開いた状態で起動します。

  • 0 は標準入力で、何らかの方法でテキストを処理するコマンドが入力がファイルから出ない場合は入力を読み込みます。
  • 1は標準出力で、コマンドで生成された一般データに適しています(データが明示的にファイルに転送されていない場合)。
  • 2は、コマンドによって生成された有用なデータの一部ではない診断メッセージの標準エラーです。

これらの規則に違反し、より多くのファイル記述子を使用できますが、これは呼び出し側が正しいファイル記述子を指定した環境でのみアプリケーションを直接使用できることを意味します。アプリケーションでこれを簡単にテストすることはできません。ファイル記述子3以降は管理されていないため、アプリケーションの起動時に閉じられたり(検出可能)、関連性のない目的で開くことができます(検出できません)。 )。

コマンドラインからファイル名を渡すことは、複数の入力ファイルまたは出力ファイルを指定する一般的な方法です。

つまり、任意のファイル記述子にアクセスするには、次のようにします。

  • シェルから:必要な番号にリダイレクトします。例:

    IFS= read -r line <&3
    printf "%s\n" "$line" >&4
    
  • Cでは、目的のfdを呼び出し、read使用、または呼び出してstdioストリームを取得します。writefdopen
  • Perlでは、ファイルディスクリプタをコピーするために開くファイル名にシェルリダイレクトを指定するか、=一般的なfdopen

    open IN3, "<&=3";
    open OUT4, ">&=4";
    
  • Pythonではos.fdopen

おすすめ記事