超时后select()不返回

时间:2013-01-13 10:28:50

标签: c linux select fifo

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

但是如果我通过命令创建一个FIFO文件:mknod /tmp/message p,并在shell中执行readmsg < /tmp/message。结果,如果我不在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");
        }
    }

1 个答案:

答案 0 :(得分:1)

谢谢@Mat。将printf()添加到main()附近后,也没有输出。执行readmsg时,即使没有ps的流程ID。 因此,它证明在FIFO准备好写入之前,readmsg < /tmp/message的进程被阻止。

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