如何异步“打开”和“关闭”串口?

时间:2017-02-28 16:46:41

标签: c linux asynchronous serial-port aio

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

我看到close阻止了一秒多。

1 个答案:

答案 0 :(得分:1)

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

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

作为一般规则,如果您经常致电open()close(),则无法获得高性能。两者都不可避免地涉及使内核运行大量代码检查权限,分配内核结构,锁定内核结构等。通常,对于高性能文件i / o,您可以在开始时打开所需的文件,而不是关闭它们。在大多数操作系统上都可以获得出色的性能。