- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
有谁知道我在哪里可以获得有关最新 Linux 内核对 aio 的内核支持状态的最新信息? Google 搜索显示的网页可能已经过时得无可救药了。
编辑:
更具体地说,我对非文件相关的描述符感兴趣,例如管道和套接字。网上说不支持,现在还这样吗?
编辑2:我要找的是类似于 Windows OVERLAPPED IO 的东西
最佳答案
您不需要 POSIX AIO(即 man aio)来异步使用套接字和管道。根据 man 3 aio
这甚至是不可能的。您应该改用非阻塞文件描述符,并结合事件通知接口(interface),例如select()
、poll()
或 epoll
。 epoll
是特定于 Linux 的,但比前两者的扩展性要好得多。
要在非阻塞模式下使用文件描述符,您必须在每个文件描述符上设置 O_NONBLOCK
标志:
fcntl(fd, F_SETFL, O_NONBLOCK)
文件描述符处于非阻塞模式后,read()
和 write()
等 I/O 操作将永远不会阻塞,但会返回 EAGAIN
或 EWOULDBLOCK
如果操作不能立即完成。一些更具体的操作,如connect()
,必须在非阻塞模式下以不同的方式使用;请参阅相关手册页。
为了能够正确使用非阻塞文件描述符,您的应用程序需要 event driven .基本上,在 main()
中,您需要先初始化一些东西,然后进入事件循环。事件循环重复等待事件(使用事件通知接口(interface),例如 epoll_wait()
),然后检查发生了哪些事件,并响应它们。
现在,当您调用 read()
时,它因 EWOULDBLOCK
而失败,您将其添加到可读性监视文件描述符列表中;当事件提供者指示可读性时,您再试一次。
类似地,如果您尝试 write()
而它因 EWOULDBLOCK
而失败,您可能需要缓冲数据并在指示可写性时重试。
关于c++ - Linux 上的 AIO 支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7956731/
有人可以解释一下 posix AIO 和 freebsd AIO 之间的区别吗?看起来功能是一样的,aio_read/aio_write。 我了解到linux native AIO只有在linux下才
最近在研究linux io模型,经常听说linux和windows IOCP一样,有自己的aio模型实现:Glibc aio和kernel aio。 问题: (1) 当人们说“linux native
我正在尝试在 Linux 上使用异步 io。据我所知,有 3 个选项: 内核调用(io_submit 和 friend ) libRT - 在用户空间使用线程 libRTKAIO - 不使用线程的内核
一 需求 使用 AsynchronousServerSocketChannel 搭建服务端,使用 AsynchronousSokectChannel 搭建客户端,完成客户端和服务端的一次通信。 二 实
我希望 aio 在读取操作完成时向我的程序发出信号,并根据 this page ,这样的通知可以通过内核发送的信号接收,也可以通过启动运行用户函数的线程来接收。可以通过设置 sigev_notify
根据 this tutorial在 linux 上使用 AIO 可以很容易地实现异步磁盘文件 io,至少从编程/api 的角度来看是这样。但在本教程之前和之后,我阅读了很多帖子和文章,认为这要么无法完
一丶IO模型&Java IO Unix为程序员提供了以下5种基本的io模型: blocking io: 阻塞io nonblocking io: 非阻塞io
介绍 什么是IO呢?什么是阻塞非阻塞IO?什么是同步异步IO?什么是IO多路复用?select/epoll跟IO模型有什么关系?有几种经典IO模型呢?BIO、NIO、AIO到底有什么区别的? 什么是I
谁能告诉我一些使用内核 AIO(即 io_submit() 系列)的(最好是常用的)应用程序,例如任何 SQL/非 SQL 数据库等?我希望它能够在每个线程上发出队列深度超过 1 的异步读取,以完全饱
根据关于 aio_read/write 的文档,AIO 库基本上可以通过两种方式通知您的应用程序异步文件 I/O 操作已完成。要么 1) 您可以使用信号,2) 您可以使用回调函数 我认为回调函数比信号
我正在尝试在 ubuntu 上编译 nginx,我正在使用以下配置参数: ./configure \ --prefix=/usr/share/nginx \ --conf-path=/etc/
我正在玩 Java NIO2,我正在尝试编写一个基于 AsynchronousServerSocketChannel 的 TCP 聊天服务器。 对一个简单的 ECHO-Server 进行编程没有问题并
我的应用程序有时会因 SIGIO 或 SIGUSR1 信号而终止,即使我已经阻止了这些信号。 我的主线程从阻塞 SIGIO 和 SIGUSR1 开始,然后进行 2 个 AIO 读取操作。这些操作使用线
有谁知道我在哪里可以获得有关最新 Linux 内核对 aio 的内核支持状态的最新信息? Google 搜索显示的网页可能已经过时得无可救药了。 编辑: 更具体地说,我对非文件相关的描述符感兴趣,例如
我正在尝试使用 C++ 异步读取和写入磁盘(使用 Ubuntu 10.04 中的 posix aio 库),遵循此处概述的说明:aio tutorial .我可以异步读写,但恐怕会出现某种小的内存泄漏
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 8 年前。 Improve this qu
在 Linux 中,您可以读取 /proc/sys/fs/aio-nr 的值,这将返回总数。在系统中所有事件的 aio 上下文中分配的事件。最大值由 /proc/sys/fs/aio-max-nr 控
作为调试 IO 生成器的一部分,我在 x64 硬件上运行的 RH 6.4 下遇到了一组奇怪的结果(在多个系统上验证): -- 应用程序使用 linux 异步 IO(即非 posix)访问原始磁盘分区(
使用内核 AIO 和 O_DIRECT|O_SYNC,不会复制到内核缓冲区,并且可以在数据实际刷新到磁盘时获得细粒度通知。但是,它需要将数据保存在 io_prep_pwrite() 的用户空间缓冲区中
我正在编写一个C程序,通过直接从原始块设备文件读取来从SSD驱动器读取数据。 我正在尝试Linux AIO(我正在谈论Linux AIO API,即linuxaio.h提供的功能,例如io_submi
我是一名优秀的程序员,十分优秀!