我目前正在开发一个嵌入式应用程序(运行在linux 4.14上),它使用POSIX线程实现两个线程(主线程和一个通信线程)。
通信线程创建一个POSIX队列来处理来自主线程的命令请求(通过调用mq_send())。它还可以处理来自引发SIGIO信号的串行线的输入数据。
下面是一个示例代码
主线:
pthread_t com_thread;
mqd_t cmd_queue;
void main (void)
{
struct mq_attr attr;
init_serial(); // Does serial line init and se
我正在开发一个应用程序,它将从Linux上的串行/ UART读取数据。当UART拥有来自外部源的数据时,我正在尝试唤醒/解除阻塞,当从外部源异步读取数据时,线程就会开始读取数据。我正在考虑使用signal (SIGIO)“软中断”,而不是select()或pselect(),但我不确定我能否从信号中得到我想要的多线程应用程序中的行为。
当我配置设备文件描述符时,我希望设置F_SETOWN(int)以使内核向我设置为阻止SIGIO的线程发送信号。
// Configure the signal to send
fcntl(m_fileId, F_S
根据我的研究,您可以添加一个epoll文件描述符来轮询、选择或其他epoll,如果事件可用,它将返回POLLIN。根据epoll(7):
Q3 Is the epoll file descriptor itself poll/epoll/selectable?
A3 Yes. If an epoll file descriptor has events waiting, then it will
indicate as being readable.
这在我的测试中有效。但是,我现在正尝试将O_ASYNC应用于我的epoll fd,以便在事件准备就绪时它会引
我正在尝试接收串行数据,但我找不到时间。
当接收到串行数据时,SIGIO何时触发-在接收到数据的第一个字节时,还是在接收到特定字符(CR、NL...)时?
设置串行数据端口:
/* Open serial port.
* O_RDONLY - Only receive data
* O_NOCTTY - Leave process control to other 'jobs' for better portability.
* O_NDELAY - Enable non-blocking read
*/
fd = open(PORT_PATHNAME, O_RD
我想使用O_ASYNC选项,当管道可以读取时,SIGIO的处理程序将运行。
但是下面的代码不起作用。有谁能帮我吗?
#!/bin/env perl
use Fcntl;
$SIG{IO}= sub {
print "catch SIGIO!\n";
};
my $flags=0;
open(FH,"-|","sleep 4 ;echo aaa") or die "$!";
fcntl(FH,F_GETFL,$flags) or die "$!";
fcntl(FH,F_SETFL,$flags | O