“stdin”的这种行为有什么问题?

时间:2018-03-07 14:40:36

标签: c unix io

我正在测试系统调用'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'中?

提前致谢

0 个答案:

没有答案