shell/initはどのようにstdioストリームを生成しますか?

shell/initはどのようにstdioストリームを生成しますか?

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用)を開きます。

open1)同じプロセスで同じデバイスに複数回アクセスし、異なるファイル記述子を期待することはどのように可能ですか?

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ページを参照してください。入力するそして**出力*

おすすめ記事