0

我创建了一个名为“readmsg”的可执行文件。它的源代码如下。如果select()我只readmsg在 shell 中执行(我可以看到输出timeout)。

但是,如果我通过 command: 创建一个 FIFO 文件mknod /tmp/message p,并readmsg < /tmp/message在 shell 中执行。结果,select()如果我不在/tmp/message. 我的问题是:为什么我不能得到timeout输出?

“readmsg”的源代码:

    #define STDIN 0
    fd_set fds;
    struct timeval tv;
    while (1) {
        FD_ZERO(&fds);
        FD_SET(STDIN, &fds);
        tv.tv_sec = 1;
        tv.tv_usec = 0;
        ret = select(STDIN + 1, &fds, NULL, NULL, &tv);
        if (ret > 0) {
            printf("works\n");
            if (FD_ISSET(STDIN, &fds)) {
                // read ...
            }
        } else if (ret == 0) {
            printf("timeout!!\n");
        } else {
            printf("interrupt\n");
        }
    }
4

1 回答 1

1

谢谢@Mat。添加printf()close to后main(),也没有输出。即使没有readmsgwhen perform的进程ID ps。所以证明在readmsg < /tmp/messageFIFO准备好写入之前,进程就被阻塞了。

没有任何错误。事实上,readmsg从重定向的 FIFO 文件中读取消息时效果很好。

于 2013-01-13T12:36:49.503 回答