AIX open(): ファイル記述子 0(!?)

AIX open(): ファイル記述子 0(!?)

特定のディレクトリにテキストファイルがあることを検出した後、デーモンは上記のテキストファイルを開いてデータを読み込み、そのデータをTCPソケットを介して転送する実行可能ファイルを起動します。

オープンテキストファイルのファイル記述子番号は、ファイル処理に関するその他の情報とともに記録されます。

時々、open()呼び出しはファイル記述子0を返すことがわかりました(通常はstdin用に予約されています)。エラーは検出されず、すべてがうまく機能します。 Cのソースコードは、open()と後でclose()のみを実行します。返されたファイルハンドルに対してリダイレクト、コピー、またはその他の魔法は行われません。

どのような状況でプロセスのファイル記述子0を一般的な目的に使用できますか(そしてstdinに帰属しません)?

プラットフォームはAIX 5.2です。

答え1

どのような状況で、プロセスのファイルディスクリプタ0が通常の目的で利用可能になりますか(そしてstdinに帰属しません)?

<&-誰かが例えばシェルの標準入力を閉じたとき。

#include <stdio.h>
#include <sys/stat.h>
#include <fcntl.h>
int main() {
    printf("%d\n",open("foo",O_CREAT));
}

答え2

システムopenコールは通常、まだ使用されていない最も低いファイル記述子を返します。一般的なプログラムでは、ファイル記述子0、1、2が事前に開かれた標準記述子(入力、出力、エラー)に使用されるため、開かれたファイルは3から始まります。デーモンは入力を読み取ったり出力を生成したりしないため、通常はファイル記述子0と1を閉じるか、そこで/dev/null再び開きます。デーモンがファイル記述子0を閉じると、次に開くファイルはその記述子にあります。何の問題もありません。

ファイル記述子0は実際には「stdinに帰属」されません。はいstdin stdinの定義によると。一般的なオペレーティング環境では、ファイル記述子0が入力用に開かれるように準備しますが、入力を読み取らないプログラムは、目的の任意の目的でこの記述子を自由に使用できます。

関連情報