0

私はこれを持っています:

//...
      if ((tty = open("/dev/tty",O_RDONLY | O_NDELAY) ) == -1 )
        {
                perror("/dev/tty");
                return 1;
        }
        //...
        if (-1 == (fi = open(argv[1], O_RDONLY)) )
        {
                perror(argv[1]);
                return 1;
        }
        //...
        while (1)
        {
                printf("you have five seconds to enter a line number %d", line); 
                sleep(5);
                i = read(tty, buf, 257);
                printf("read %d\n", i);
                if ( i == -1) {
                        perror("dev/tty/"); 
                        // if nothing was entered read always returns -1
                        //and perror prints: Resource temporarily unavailable. it's STRANGE!!!
                }
                if ( i == 0 )
                {
                        lseek(fi, 0, SEEK_SET);
                        while((i = read(fi, buf, BUFSIZ)) > 0) 
                              write(1, buf, i);
                        return 0;
                }
                //...
                if ( 0 == read(fi, buf, lines_length[line]))
                {
                        fprintf(stderr,"can't read\n");
                        return 1;
                }
                write(1, buf, lines_length[line]);
        }
 //...

したがって、O_NDELAYフラグを指定して/ dev / ttyを開きますが、後で読み取ると-1が返される(0を返す必要がある)ため、何か問題があるようです。何が悪いのかわかりません。そしてもう1つの質問:printf( "5秒あります")がwrite(1、buf、lines_length [line]);の後に出力するのはなぜですか。

4

2 に答える 2

4

何も入力されていない場合、 read は常に -1 を返し、perror は次のように出力します: リソースは一時的に利用できません。それは奇妙です!!!

それがまさにO_NDELAYやるべきことです。読み取り操作が完了するのを待ちません。一度に実行できない場合は、ブロックする代わりに を返し-1て設定しますerrno = EAGAIN


2 番目の質問については、出力をフラッシュしていません。試してください: fflush(stdout).

于 2013-03-10T08:12:40.850 に答える
1

UNIX システムの初期のバージョンでは、ノンブロッキング操作にフラグ O_NDELAY が使用されていました。O_NDELAY が設定されている場合、read は 0 を返しました。これは Unix の慣習に反するため (返される 0 はファイルの終わりを示します)、POSIX.1 はノンブロッキング モードのフラグを定義しました - O_NONBLOCK。現在、フラグ O_NDELAY は互換性のためにのみ使用されており、最新のアプリケーションでは使用しないでください。

于 2013-03-10T15:02:38.697 に答える