Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/98.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何异步“打开”和“关闭”串行端口?_C_Linux_Asynchronous_Serial Port_Aio - Fatal编程技术网

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

C 如何异步“打开”和“关闭”串行端口?,c,linux,asynchronous,serial-port,aio,C,Linux,Asynchronous,Serial Port,Aio,我正在尝试以异步方式使用串行端口。我可以使用select、poll或epoll和O_NONBLOCK进行异步读写。但是打开和关闭呢 我已经看到close阻塞超过一秒钟。很少有操作系统实现真正的异步open()和close()(将O\u NONBLOCK指定为open()意味着不要在等待连接或输入时睡觉,而不是真正在后台执行操作)。想到的两个是QNX和Hurd,它们都是微内核操作系统设计,根据定义,每个系统调用都是可多次执行的,因此是异步的 至于原因,从历史上看,在open()完成之前,您无法执行

我正在尝试以异步方式使用串行端口。我可以使用
select
poll
epoll
O_NONBLOCK
进行异步读写。但是
打开
关闭


我已经看到
close
阻塞超过一秒钟。

很少有操作系统实现真正的异步
open()
close()
(将
O\u NONBLOCK
指定为
open()
意味着不要在等待连接或输入时睡觉,而不是真正在后台执行操作)。想到的两个是QNX和Hurd,它们都是微内核操作系统设计,根据定义,每个系统调用都是可多次执行的,因此是异步的

至于原因,从历史上看,在
open()
完成之前,您无法执行任何操作,因此API设计人员从未想过使其异步。最近,如果您真的希望它是异步的,可以从线程池进行调用
close()
更有趣一点,实际上很难快速关闭文件描述符而不丢失有价值的信息,而丢失这些信息会导致数据丢失,例如“我刚才尝试写入的缓冲数据失败”。但是,如果您确实需要
close()
异步,只需从线程池调用它即可


一般来说,如果多次调用
open()
close()
,就不能期望高性能。两者都不可避免地涉及到让内核运行大量的代码检查、分配内核结构、对内核结构进行锁定等。例如,对于高性能文件i/o,通常在开始时打开需要的文件,而从不关闭它们。这在大多数操作系统上都能获得很好的性能。

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

至于原因,从历史上看,在
open()
完成之前,您无法执行任何操作,因此API设计人员从未想过使其异步。最近,如果您真的希望它是异步的,可以从线程池进行调用
close()
更有趣一点,实际上很难快速关闭文件描述符而不丢失有价值的信息,而丢失这些信息会导致数据丢失,例如“我刚才尝试写入的缓冲数据失败”。但是,如果您确实需要
close()
异步,只需从线程池调用它即可


一般来说,如果多次调用
open()
close()
,就不能期望高性能。两者都不可避免地涉及到让内核运行大量的代码检查、分配内核结构、对内核结构进行锁定等。例如,对于高性能文件i/o,通常在开始时打开需要的文件,而从不关闭它们。这在大多数操作系统上都能获得很好的性能。

为什么要将轮询API(
select
poll
等)与非阻塞FD一起使用?每当以下写入/读取操作不应阻塞时,它们就会返回,而使用非阻塞fd时,即使没有任何内容可读取,也会返回。因为我不需要100%的cpu,而且我有多个fd。我想说的是,例如,
select
不会等待fd可读,它等待后续读取不会阻塞的时刻,这总是针对
O_NONBLOCK
文件描述符。open()有一个非阻塞选项,但close()没有选项。此外,您不应该经常进行这些系统调用,那么这又有什么关系呢?“我不想要100%的cpu”——似乎您不明白在多处理环境中阻止I/O的目的。“我有不止一个fd。”——这可能是你写的最明智的事情,但是你把它埋在了一条评论中。为什么你想对非阻塞fd使用轮询API(
select
poll
等)?每当以下写入/读取操作不应阻塞时,它们就会返回,而使用非阻塞fd时,即使没有任何内容可读取,也会返回。因为我不需要100%的cpu,而且我有多个fd。我想说的是,例如,
select
不会等待fd可读,它等待后续读取不会阻塞的时刻,这总是针对
O_NONBLOCK
文件描述符。open()有一个非阻塞选项,但close()没有选项。此外,您不应该经常进行这些系统调用,那么这又有什么关系呢?“我不想要100%的cpu”——似乎您不明白在多处理环境中阻止I/O的目的。“我不止一个fd。”——这可能是你写的最明智的事情,但你把它埋在了评论里。