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)。我不知道出了什么问题。还有一个问题:为什么printf("you have 5 sec")在write(1, buf, lines_length[line]);之后打印

4

2 回答 2

4

如果未输入任何内容,则 read 总是返回 -1 并且 perror 打印:资源暂时不可用。真奇怪!!!

这正是O_NDELAY应该做的。它不会等待读取操作完成。如果它不能立即执行,而不是阻止它返回-1并设置errno = EAGAIN


至于你的第二个问题,你没有刷新输出。试试: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 回答