0

我正在尝试以异步方式使用串行端口。我可以使用select,pollepollwithO_NONBLOCK进行异步读写。但是openclose呢?

我已经看到close块超过一秒钟了。

4

1 回答 1

2

很少有操作系统实现真正的异步open()close()(指定意味着O_NONBLOCK不要open()休眠等待连接或输入,而不是真正在后台执行操作)。想到的两个是 QNX 和 Hurd,它们都是微内核操作系统设计,其中每个系统调用根据定义都是可复用的,因此是异步的。

至于为什么,从历史上看,在完成之前你什么都做不了,open()所以 API 设计者从没想过让它异步。最近,如果您真的希望它是异步的,请从线程池进行调用。close()更有趣的是,实际上很难快速关闭文件描述符而不丢失有价值的信息,这些信息的丢失将导致数据丢失,例如“我刚刚尝试写出的缓冲数据失败”。但同样,如果你真的需要close()异步,只需从线程池中调用它。

作为一般规则,如果你跟注很多open(),你就不能期待高性能。close()两者都不可避免地涉及使内核运行大量代码检查权限、分配内核结构、锁定内核结构等。通常,例如,对于高性能文件 i/o,您在开始时打开您需要的文件,从不关闭它们。这在大多数操作系统上都具有出色的性能。

于 2017-02-28T22:59:52.520 回答