2017-02-28 18 views
0

我试图以异步方式使用串行端口。我可以使用selectpollepollO_NONBLOCK来进行异步读取和写入操作。但是openclose呢?我看过close块已经超过一秒钟了。如何异步打开和关闭串口?

+0

你为什么要使用非阻塞fds的轮询API('select','poll'等)?只要后面的写入/读取不会被阻塞,并且在非阻塞fds的情况下,它们都会返回,即使没有任何可读的信息,它也会一直返回。 – silen

+0

因为我不想要100%的CPU,并且我有多个fd。 – kptlronyttcna

+1

我想说的是,例如'select'不等待fd是可读的,它等待后续读取不会被阻塞的时刻,这总是针对'O_NONBLOCK'文件描述符。 – silen

回答

1

有其实现真正的异步open()close()(指定O_NONBLOCKopen()手段不睡等待连接或输入,实际上不是在后台真正执行该操作)很少操作系统。想到的两个问题是QNX和Hurd,它们都是微内核操作系统设计,其中每个系统调用按定义是可复用的,因此是异步的。

至于为什么,直到open()完成之前,您无法做任何事情,所以API设计人员从来没有想过要使它成为异步。最近,如果你真的希望它是异步的,请从线程池中调用。 close()更有趣一点,实际上很难快速关闭文件描述符而不会丢失有价值的信息,而丢失这些信息会导致数据丢失,例如“我试图写出的缓冲数据失败”。但是,如果你真的需要close()作为异步,只需从线程池调用它。

作为一般规则,如果您拨打open()close()很多,您不能指望高性能。两者都不可避免地涉及到让内核运行大量的代码检查权限,分配内核结构,锁定内核结构等。一般来说,对于高性能的文件I/O,例如,您在开始时打开需要的文件并且永远不要关闭它们。这对于大多数操作系统的出色表现都很有帮助。