stdin、stdout、stderr(fds)はどこにありますか?最初開いている?カーネルで作ったのですか?シンボリックリンク/dev/std{in,out,err}はいつどこで作成されましたか?これを行うコードはどこにありますか?
私はそれがLinuxカーネルソースにあると仮定していますが、archlinux 6.5.3-arch1-1 Linuxカーネルのgithubリポジトリで検索した後でもどこで発生するのかわかりません。
編集:この質問に反対票を投げたら、私がもっとうまくいくように理由を説明してください。この質問は本当に知りたいです。答えを見つけるのは簡単ではありません。
答え1
プロセスが開始されると、オペレーティングシステムが実行する作業の一部は、プロセスのファイル記述子を管理するデータ構造を生成し、通常はディスクリプタ0、1、2をプロセスが制御するターミナルデバイスへのポインタを埋めることです。 。一部のプロセスは、端末以外のデバイス(通常は/ dev / nullデバイス)に接続されているファイル記述子を使用して開始されます。一部のプロセスは、1つ以上のファイル記述子を他のプロセス(通常はパイプ)またはファイル(たとえば「リダイレクト」)に接続するインターフェイスに接続します。親プロセスは子プロセスを作成する前にこれらの記述子のファイル/パイプを開く関数を呼び出すことができますが、ファイル記述子を追跡するデータ構造を管理することはまだカーネルです。この種の詳細を知る必要がある場合は、Unix / Linuxの内部に関する本を参照してください。
各プロセスには独自の別々のファイル記述子のリストがあるため、特定の日付/時刻に作成されたことを指して話すことができるユニバーサル記述子またはデバイスファイルのセットはありません。プロセスの記述子は、そのプロセスの開始時に生成され、新しいプロセスが大量に開始されるため、常にファイル記述子が生成されます。 (プロセスが終了し、オペレーティングシステムがクリーンアップされると削除されます。)
/dev/stdin、/dev/stdout、/dev/stderr についてお問い合わせください。これは物理デバイスではなく、仮想デバイス(しばしば「論理的」デバイスと呼ばれます)です。プロセスIDをls -l /dev/stdin
使用すると、2番目のターミナルのシェルから呼び出された別のプロセスIDを参照して使用するコマンドを指し、リンクが特定の場所に生成されたことを確認できます。 time 。ただし、ディレクトリとファイルは、実際には管理プロセスを囲むカーネルデータ構造を表示するディレクトリのセットを指します。これらのデータ構造は、プロセスごとに異なる値(プロセスIDなど)を持ちます。プロセスが開始、終了し、新しいセクションが作成され、削除されます。/proc/self/fd/0
/proc/self
ls
/proc/self
ls
/dev/stdin
/dev/stdout
/dev/stderr
私はあなたの質問に反対表を投げませんが、私の考えでは、この単純に見える質問が実際に正確に答えるためには多くの内部知識が必要です。これはカーネルソースコードでは明確ではありません。それで、私はあなたがそれを探求するのを助けるために内部操作に関する本を購入することに言及しました。このタイプのQ&Aフォーラムには制限があり、オペレーティングシステム内の拡張チュートリアルスタイルの回答はここには適していません。
答え2
いいえ、カーネルは関係ありません。 main() に入る前に、最初のブートユーザー空間コードで開きます。