我必须编写程序来根据 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/