【发布时间】:2018-09-28 14:06:54
【问题描述】:
我正在开发一个应用程序,它将在 Linux 上从串行/UART 读取数据。当 UART 从外部源异步获取数据时,我正在尝试唤醒/解除阻止 pthread 开始读取数据。我正在考虑使用信号(SIGIO)“软中断”而不是 select() 或 pselect(),但我不确定是否可以从信号中获得我想要的多线程应用程序的行为。
当我配置设备文件描述符时,我想设置 F_SETOWN(int) 以让内核向我设置为阻塞 SIGIO 的 pthread 发送信号。
// Configure the signal to send
fcntl(m_fileId, F_SETSIG, m_sigNum);
// Set to non-blocking read mode
fcntl(m_fileId, F_SETFL, FNDELAY);
// Bind the PID of the task which is getting the signal
fcntl(m_fileId, F_SETOWN, m_pid);
// Enable sending a signal when data ready
fcntl(m_fileId, F_SETFL, O_ASYNC);
我意识到,当我编写代码时,m_pid 被设置为进程 ID,而不是 pthread ID,当我检查手册页时......
根据 fnctl(2) 手册页:
F_SETOWN (int)
将接收文件描述符 fd 上事件的 SIGIO 和 SIGURG 信号的进程 ID 或进程组 ID 设置为 arg 中给出的 ID。进程 ID 指定为正值;进程组 ID 指定为负值。最常见的是,调用进程将自己指定为所有者(即,arg 被指定为 getpid(2))。
您可以在调用 pthread_self() 时传入一个 pthread ID,而不是使用 getpid() 作为进程 ID,这样只有特定的线程才能获得信号吗?
【问题讨论】: