特定のディレクトリにテキストファイルがあることを検出した後、デーモンは上記のテキストファイルを開いてデータを読み込み、そのデータを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が入力用に開かれるように準備しますが、入力を読み取らないプログラムは、目的の任意の目的でこの記述子を自由に使用できます。