我必须编写基于udp套接字接收的数据执行操作的程序,并且必须在可能的情况下将数据写入管道(可能的意思是管道中有足够的空间)。管道阻塞,实际上是stdout。
如果不写behavior,我会写成这样:
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);
}
}如何添加到程序编写行为中?
写入时轮询只能表明写入一个字节将不会阻塞,并且每次只写入一个字节并不是很有效。据我所知,我不能将文件标志设置为非阻塞,因为它会使其他程序从该管道读取数据(它会更改文件描述,而不是文件描述符)。
发布于 2018-08-25 07:47:02
正如您所指出的,poll()将告诉您是否至少有一个字节是可写的,而不会阻塞。管道可能能够接受更多的字节,但在执行写操作之前,您无法真正判断。
如果管道设置为非阻塞,write()将写入尽可能多的字节,并返回实际写入的字节数。
然后,你必须保持跟踪,下一次管道是可写的。,,,。如果您有(比方说) 1000字节要写入,而写操作只接受(比方说) 250字节,那么您必须在缓冲区中前进250字节,并在管道再次可写时尝试写入剩余的750字节。
https://stackoverflow.com/questions/51994830
复制相似问题