c++ - poll返回0但read不阻塞

标签 c++ c polling

我已经研究这段代码一段时间了,由于某种原因,即使有数据要从 outFds 管道读入, poll 也会返回零。由于某种原因,如果我读入一些数据然后运行轮询,它会返回正确的值,但这不是解决方案。有人以前见过这个并知道我应该做什么吗?

#include <stdio.h>
#include <stdlib.h>
#include <sys/poll.h>

int main(void)
{
    int outFds[2];

    pipe(outFds);

    if(!fork()) {
        dup2(outFds[1], 1);

        close(outFds[0]);
        close(outFds[1]);

        // disable printf buffering
        setvbuf(stdout, NULL, _IONBF, 0);

        sleep(1);
        char buf[32];
        printf("blah");

        exit(0);
    }

    close(outFds[1]);

    char c;
    // Read 'b' into c. If this next line is not commented poll returns 1
    //read(outFds[0], &c, 1); 

    struct pollfd outFd;
    outFd.fd = outFds[0];
    outFd.events = POLLIN;
    printf("%d\n", poll(&outFd, 1, 0)); // poll returns 0 for some reason
}

最佳答案

来自联机帮助页:

Specifying a timeout of zero causes poll() to return immediately, even if no file descriptors are ready.

我会将其读取为 timespec 结构,其中 tv_sectv_nsec 设置为 0,但似乎将 nullptr 具有相同的效果。

关于c++ - poll返回0但read不阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32644484/

相关文章:

java - 在没有轮询的情况下观察变量的变化

c++ - 能够访问索引大于数组长度的元素

c++ - 如何在异常中抛出有意义的数据?

c - 如何使用指向结构的指针进行迭代?

C:如何从一个文件中读取一行,并将其附加到另一个文件中?

android - 如何实现一对一消息连接

c++ - 按值返回 std::vector

c++ - 将多个参数传递给 operator[]

c - 你如何在cmd中运行一个c程序

python-3.x - 如何有效地检测Python 3中变量的变化?