Skip to content
Latchkey

file descriptor とは何か? I/O のための番号付きハンドル

file descriptor は、オペレーティングシステムがプロセス内の開いているファイル、ソケット、ストリームのハンドルとして使う小さな整数です。

内部では、プロセス内のすべての開いているファイルやストリームは、file descriptor と呼ばれる番号で参照されます。最もよく出会う 3 つは 0、1、2、すなわち stdin、stdout、stderr です。descriptor を理解すると、CI スクリプトのあちこちに現れる 2>&1 のような一見難解なリダイレクトが説明できます。

file descriptor とは

プロセスがファイルを開くと、カーネルはそれを識別する小さな整数を返します。プロセスはすべての read や write にその番号を使います。descriptor はプロセスごとなので、同じ番号が異なるプログラムでは異なるものを意味します。

3 つの標準 descriptor

  • 0 は stdin、入力ストリーム。
  • 1 は stdout、通常の出力ストリーム。
  • 2 は stderr、エラーストリーム。

番号によるリダイレクト

ストリームは descriptor 番号でリダイレクトします。2> errors.log は descriptor 2 (stderr) をファイルに送ります。2>&1 は descriptor 2 を descriptor 1 が現在指している場所に向け、ストリームを統合します。

より高い descriptor

0、1、2 を超えて、プロセスはさらに多くのファイルを開き、descriptor 3、4 などを得られます。高度なスクリプトは追加の descriptor を開くことがありますが、ほとんどの CI 作業は標準の 3 つだけを扱います。

CI における file descriptor

CI でログを read し write することは、すべて descriptor の作業です。> out.log 2>&1 が stdout をファイルにリダイレクトし、次に stderr を同じ場所に向けることを知っておくのが、build ステップから完全なログをキャプチャする鍵です。

managed runner でのストリーム処理

Latchkey runner はステップの stdout と stderr を自動的に job ログに接続します。ステップの完全な出力をファイルにも必要とするときは、標準の descriptor リダイレクトがローカルとまったく同じように機能します。

重要なポイント

  • file descriptor は、開いているファイルやストリームの数値ハンドルです。
  • descriptor 0、1、2 は stdin、stdout、stderr です。
  • 2>&1 のようなリダイレクトはこれらの番号を操作して CI ログをルーティングします。

関連ガイド