私はCのシェルプログラムの実装について読んでいます(MIT 6.828オペレーティングシステムエンジニアリングプロセスのxv6シェル)。
シェルの機能はmain()
次のコードで始まります。
//Assumes three file descriptors open
while((fd = open("console", O_RDWR)) >= 0){
if(fd >= 3){
close(fd)
break;
}
}
以下は、上記のコードを説明するxv6本の引用です。
シェルは、コンソールのデフォルトのファイル記述子である3つのファイル記述子が常に開いていることを確認します。
私はこれがopen()
利用可能な最小数のファイル記述子を返すことを知っているので、このコードは3つ以下のファイル記述子が開かないことを保証します。これは、作者の説明を読んだ後に非常に明白です。
ただし、理解できない部分は次のとおりです。
シェルが0、1、2を除くすべてのファイル記述子を閉じるのはなぜですか?結局、0、1、2がコンソールに接続されることは保証されませんか?シェルが多数のファイル記述子を閉じるのに気をつけなければならないのはなぜですか?
ここでは、コンソール( /dev/console ?)ファイルの目的をよく理解していないようです。
答え1
このコードスニペットが開きます/dev/console
。結果ファイル記述子は、まだ開かれていない最も低い番号のファイル記述子です。数字が最大2の場合、ループを再実行します。数字が 3 以上の場合、記述子は閉じ、ループは停止します。
ループが終わると、ファイル記述子0〜2(標準入力、標準出力、標準エラー)開示が保証されます。これらのファイルは以前に開かれ、潜在的にファイルにリンクされているか、開いたばかりで接続されました/dev/console
。
選択/dev/console
が変です。私は/dev/tty
常に呼び出しプロセスのプロセスグループに関連付けられた制御端末であることを望みます。これは数少ないファイルの一つですPOSIX 標準には以下が必要です。。/dev/console
~であるシステムコンソール、これはsyslogメッセージがコンソールに送信される場所です。シェルがこれを気にするのは役に立ちません。
答え2
ループは楽しいです。 'open()' は最小ファイル記述子数を返します。たとえば、現在のfdは10です。これは、0、1...、および9が以前に開かれたことを示します。開いたばかりのコンソールの追加ファイル記述子を閉じます。