Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.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
Linux:多个SIGIO问题(异步串行通信) 我正在研究C++程序中的一个SIGIO相关问题。 平台:Linux 2.6.30、x86 Arch 场景:异步串行通信_Linux_Asynchronous_Serial Port_Signals - Fatal编程技术网

Linux:多个SIGIO问题(异步串行通信) 我正在研究C++程序中的一个SIGIO相关问题。 平台:Linux 2.6.30、x86 Arch 场景:异步串行通信

Linux:多个SIGIO问题(异步串行通信) 我正在研究C++程序中的一个SIGIO相关问题。 平台:Linux 2.6.30、x86 Arch 场景:异步串行通信,linux,asynchronous,serial-port,signals,Linux,Asynchronous,Serial Port,Signals,我遵循Linux串行编程HowTo,它工作得非常完美 然后我删除了“sleep+check wait_标志”,现在我直接在signal_handler_IO()中处理read()部分。也就是说,当某些输入可用时,将调用信号处理程序,并强制读取串行端口(*) 我的代码似乎可以工作,但不幸的是,当新的输入可用时,SIGIO信号会被触发几次,因此我会得到虚假/不完整的读取(每个接收到的SIGIO都会强制读取) 我更改了串行选项以控制读取缓冲区(即VMIN=255/VTIME=15,VMIN=50/VT

我遵循Linux串行编程HowTo,它工作得非常完美

然后我删除了“sleep+check wait_标志”,现在我直接在signal_handler_IO()中处理read()部分。也就是说,当某些输入可用时,将调用信号处理程序,并强制读取串行端口(*)

我的代码似乎可以工作,但不幸的是,当新的输入可用时,SIGIO信号会被触发几次,因此我会得到虚假/不完整的读取(每个接收到的SIGIO都会强制读取)

我更改了串行选项以控制读取缓冲区(即VMIN=255/VTIME=15,VMIN=50/VTIME=0,…)。我尝试设置SA_SIGINFO标志(正如一些人建议的那样),但没有成功

因此:

  • 关于SIGIO提升/处理,我遗漏了什么
  • 有没有办法避免这场“信号风暴”
  • 有没有办法控制SIGIO的募捐政策
提前谢谢

再见


(*):实际上,我正在跟踪,因此信号处理程序调用一个对象的成员函数,该对象封装了我所有的串行处理内容。不幸的是,即使我在信号处理程序中调用read(),问题仍然会发生。

您在信号处理程序中调用的是
read
?这很糟糕。很少有函数是可用的。SIGIO风暴可能是由读取递归发送SIGIO引起的。您的信号处理程序应该设置一个标志并立即返回。

您在信号处理程序中调用的是
read
?这很糟糕。很少有函数是可用的。SIGIO风暴可能是由读取递归发送SIGIO引起的。您的信号处理程序应该只设置一个标志并立即返回。< /P> >不,信号处理程序(如C++ FAQLite建议的)调用非静态对象的成员函数,它执行实际的读()。无论如何,我找到了一个简单的解决方案:我为读取字节添加了一个缓冲区(具有线程安全访问)。每次调用信号处理程序时,我都在串行端口上执行read(),读取的字节被追加到该缓冲区。然后“sigiostorm”问题就解决了,因为我可以在需要时通过读取缓冲区来提取所需内容。谢谢你的回复。我很高兴你找到了一个方法。澄清我关于信号安全的观点:调用成员函数并不重要;堆栈的顶部仍然是信号处理程序。不能在信号处理上下文中调用read()。也就是说,信号处理程序不能调用read(),也不能调用信号处理程序调用的任何东西。实际上,您可以从信号处理程序调用
read
。请参阅异步信号安全功能列表。在没有,信号处理程序(如C++ FAQ Lite建议)调用非静态对象的成员函数,该函数执行实际的读()。无论如何,我找到了一个简单的解决方案:我为读取字节添加了一个缓冲区(具有线程安全访问)。每次调用信号处理程序时,我都在串行端口上执行read(),读取的字节被追加到该缓冲区。然后“sigiostorm”问题就解决了,因为我可以在需要时通过读取缓冲区来提取所需内容。谢谢你的回复。我很高兴你找到了一个方法。澄清我关于信号安全的观点:调用成员函数并不重要;堆栈的顶部仍然是信号处理程序。不能在信号处理上下文中调用read()。也就是说,信号处理程序不能调用read(),也不能调用信号处理程序调用的任何东西。实际上,您可以从信号处理程序调用
read
。请参阅上的异步信号安全函数列表。