我正在测试系统调用'poll'的工作原理。但在我这样做的时候,我面临着一种不明确的行为。 请考虑以下简单示例:
#include <sys/poll.h>
#include <cstring>
#include <cstdio>
#include <cerrno>
#include <unistd.h>
int main()
{
pollfd p[2];
p[0].fd = STDIN_FILENO;
p[0].events = POLLIN;
p[1].fd = STDOUT_FILENO;
p[1].events = POLLOUT;
char *str_to_write = "Hello world!";
write(STDIN_FILENO,
str_to_write,
strlen(str_to_write));
const int NUMBER_OF_DESCRIPTORS = 2;
const int DELAY = 5;
int rt = poll(p,
NUMBER_OF_DESCRIPTORS,
DELAY * 1000);
if (rt == -1)
{
printf("Some error was occurred! %d", errno);
return errno;
}
if (rt == 0)
{
printf("Timeout was occurred! None of the events are ready =( ");
return 0;
}
if (p[0].revents & POLLIN)
{
printf("stdin was ready =)");
}
if (p[1].revents & POLLOUT)
{
printf("stdout was ready =)");
}
return 0;
}
正如我们所看到的,我将等待标准输入流,直到它准备好被读取:
p[0].fd = STDIN_FILENO;
p[0].events = POLLIN;
这就是为什么我决定用'write'方法写一些东西:
write(STDIN_FILENO,
str_to_write,
strlen(str_to_write));
请您澄清以下问题:
1)为什么我想写一些东西到'STDIN'然后得到一个告诉我们'STDIN'准备好被读取的事件不起作用?
2)当我不是在调试模式下启动程序时,屏幕上总会出现“hello world”消息(作为我程序的输出。除了stdout准备就绪的消息),但是当我在调试中启动它时模式没有这个消息。会是什么呢?为什么写入'STDIN'的信息会直接出现在'STDOUT'中?
提前致谢