select() 超时后不返回

问题描述 投票:0回答:1

我创建一个名为“readmsg”的可执行文件。其源代码如下。如果我只在 shell 中执行

select()
readmsg
就可以工作(我可以看到
timeout
的输出)。

但是如果我通过命令

mknod /tmp/message p
创建一个FIFO文件,并在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");
        }
    }
c linux fifo posix-select
1个回答
1
投票

谢谢@Mat。在靠近

printf()
添加
main()
后,也没有输出。即使执行
readmsg
时没有
ps
的进程ID。 所以证明在 FIFO 准备好写入之前
readmsg < /tmp/message
的进程就被阻塞了。

没有任何错误。事实上,当从重定向的 FIFO 文件读取消息时,

readmsg
效果很好。

© www.soinside.com 2019 - 2024. All rights reserved.