首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >非阻塞标准输出[C/ Linux]

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

Stack Overflow用户
提问于 2018-08-24 05:56:33
回答 1查看 253关注 0票数 1

我必须编写基于udp套接字接收的数据执行操作的程序,并且必须在可能的情况下将数据写入管道(可能的意思是管道中有足够的空间)。管道阻塞,实际上是stdout。

如果不写behavior,我会写成这样:

代码语言:javascript
复制
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);
    }
}

如何添加到程序编写行为中?

写入时轮询只能表明写入一个字节将不会阻塞,并且每次只写入一个字节并不是很有效。据我所知,我不能将文件标志设置为非阻塞,因为它会使其他程序从该管道读取数据(它会更改文件描述,而不是文件描述符)。

EN

回答 1

Stack Overflow用户

发布于 2018-08-25 07:47:02

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

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51994830

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档