我创建了一个名为“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");
}
}
答案 0 :(得分:1)
谢谢@Mat。将printf()
添加到main()
附近后,也没有输出。执行readmsg
时,即使没有ps
的流程ID。
因此,它证明在FIFO准备好写入之前,readmsg < /tmp/message
的进程被阻止。
没有任何错误。事实上,readmsg
在从重定向的FIFO文件中读取消息时效果很好。