MITソースを読んでいます。xv6オペレーティングシステム。クリップは次の始めに表示されますsh.c
。
// Ensure that three file descriptors are open.
while((fd = open("console", O_RDWR)) >= 0){
if(fd >= 3){
close(fd);
break;
}
}
私はこれが次のように確認することを知っています。少なくとも新しく割り当てられたファイルディスクリプタが3より高い(または等しい)ことを確認して、3つのファイルディスクリプタ(おそらくstdin、stdout、およびstderr用)を開きます。
open
1)同じプロセスで同じデバイスに複数回アクセスし、異なるファイル記述子を期待することはどのように可能ですか?
2)これを理解するために、ホストコンピュータ(x86_64 Linux 4.6.0.1)で同様のコードを実行しました。テストプログラムはopen
ループ内でテキストファイルを繰り返し編集して、他のfdを期待できることを確認しますが、常に同じファイル記述子を生成します。これから、私はxv6のコードスニペットがはっきりと動作するので、open
実際のファイルとデバイス(例えば)が何とか違うという結論を下しました(Qemuでテスト済み)。/dev/console
違いは何ですか?
#include <stdlib.h>
#include <fcntl.h>
#include <stdio.h>
int main(void)
{
int fd;
int cnt = 0;
while ((fd = open("sample.txt", O_RDWR) > 0)) {
if (cnt != 10) {
cnt++;
printf("File descriptor opened: %d\n", fd);
} else {
break;
}
}
return 0;
}
実行結果は次のとおりです。
$ ./a.out
File descriptor opened: 1
File descriptor opened: 1
[snip]
File descriptor opened: 1
File descriptor opened: 1
編集する答えの1つに基づいて実行可能strace
ファイルを実行して見つけました。open
もちろん複数のファイル記述子が返されますが、何らかの理由で何も印刷されません。なぜですか?
3) やや関連していませんが、fds 0-2でstdioストリームを使用するルールはまさにルールではありませんか?たとえば、初期化シーケンスが入力/出力ファイル記述子を別の項目に割り当てると、その子がI / Oを実行する方法にどのような影響がありますか?
ベストアンサー1
これは実際に3つの質問です。手順が間違っているため、すぐに住所#2:
while ((fd = open("sample.txt", O_RDWR) > 0)) {
おそらくあなたは
while ((fd = open("sample.txt", O_RDWR)) > 0) {
不適切に配置された括弧を使用すると、0より大きいかどうかをテストするだけですfd
(ファイル記述子0、1、2が開いているので、これはおそらく良い仮定です)。
#1の場合:open
呼び出し(成功した場合)は、別のファイル記述子を返すように定義されています。デバイスの電源を入れ直すことができない場合にopen
返されます-1
。
#3の場合:もちろんそうです。習慣、まだPOSIX基準。他のシステムは、各プログラムの第4の公開ストリームを含む異なる規則を使用する。
追加資料:Aegis環境作業(1988年7月)
Apollo Domain / OSにエラーがあることを示す6-9ページを参照してください。入力するそして**出力*