非阻塞标准输出[C / Linux]

时间:2018-08-23 21:56:33

标签: c linux pipe posix stdout

我必须编写程序,该程序根据udp套接字接收的数据执行操作,并且必须在可能的情况下将数据写入管道(可能,这意味着管道中有足够的空间)。管道阻塞,实际上它是标准输出。

没有书写行为,我会写这样的东西:

while(true) {
    if (poll(poll_fd, n, -1) > 0) {
        if (poll_fd[0].revents & POLLIN) {
            poll_fd[0].revents = 0;
            handle_read();
        }
        /* handlers for other read descriptors ... */
    } else {
        perror("poll");
        exit(1);
    }
}

如何添加程序编写行为?

写轮询只能告诉我们写一个字节不会阻塞,并且每次只写一个字节不是很有效。 据我所知,我无法将文件标志设置为非阻塞,因为它会潜藏到从该管道读取的其他程序中(它会更改文件描述,而不是文件描述符)。

1 个答案:

答案 0 :(得分:1)

如您所指出的,poll()会告诉您至少一个字节是否可写而不会阻塞。管道可以接受更多的字节,但是直到执行写操作后您才能真正知道。

如果管道设置为非阻塞,则write()将写入尽可能多的字节,并返回实际写入的字节数。

然后您必须跟踪情况,以便管道可写的下一个机会。如果您有(说)1000个字节要写入,而写操作仅接受(说)250个字节,那么您必须在缓冲区中提前250个字节,并在管道可写时尝试写入其余的750个字节。再次。