我正在尝试以异步方式使用串行端口。我可以使用select
,poll
或epoll
与O_NONBLOCK
进行异步读写操作。但是open
和close
呢?
我看到close
阻止了一秒多。
答案 0 :(得分:1)
很少有操作系统实现真正的异步open()
和close()
(指定O_NONBLOCK
到open()
意味着不要等待连接或输入,而不是实际在后台真正执行操作)。我想到的两个是QNX和Hurd,两者都是微内核操作系统设计,其中每个系统调用都是可定义的多路复用,因此是异步的。
至于为什么,从历史上看,在open()
完成之前你不能做任何事情,所以API设计师从未想过让它变得异步。最近,如果你真的希望它是异步的,那么从线程池进行调用。 close()
更有趣一点,实际上很难快速关闭文件描述符而不会丢失有价值的信息,而这些信息的丢失会导致数据丢失,例如“我刚试图写出的缓冲数据失败了”。但同样,如果你确实需要close()
为异步,只需从线程池中调用它。
作为一般规则,如果您经常致电open()
和close()
,则无法获得高性能。两者都不可避免地涉及使内核运行大量代码检查权限,分配内核结构,锁定内核结构等。通常,对于高性能文件i / o,您可以在开始时打开所需的文件,而不是关闭它们。在大多数操作系统上都可以获得出色的性能。