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

标签 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);
    }
}

如何添加程序编写行为?

poll on write只能说写一个字节不会阻塞,每次只写一个字节不是很有效。 据我所知,我无法将文件标志设置为非阻塞,因为它会泄漏给从该管道读取的其他程序(它更改文件描述,而不是文件描述符)。

最佳答案

正如您所指出的,poll() 会告诉您是否至少有一个字节可以无阻塞写入。管道可能能够接受更多字节,但在执行写入操作之前您无法真正判断。

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

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

关于c - 非阻塞标准输出[C/Linux],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51994830/

相关文章:

regex - 使用 awk 进行字符串匹配

进程间通过管道进行通信

C:如何通过套接字读取和解包消息?

linux - Dockerfile 不支持 Unix 列表吗?

c - 是否有一些方便的 C 的 ORM 库框架?

linux - 在 Debian 上从 SVN 编译并安装 Yate

c - 从管道读取后程序不会停止

linux - 如何将解析命令通过管道传递给 shell 解释器?

交叉引用 typedef 结构

c++ - 如何为 native Windows(而不是 X Windows)编译 gtk+ 应用程序?