fnctl(F_SETOWN,<;pid>;)能否将信号定向到pthread ID而不是进程ID?

fnctl(F_SETOWN,<;pid>;)能否将信号定向到pthread ID而不是进程ID?,c,linux,signals,posix,C,Linux,Signals,Posix,我正在开发一个应用程序,它将在Linux上从串行/UART读取数据。我试图唤醒/取消阻止一个pthread,当UART异步地从外部源获得数据时,该pthread开始读取数据。我正在考虑使用信号(SIGIO)“软中断”而不是select()或pselect(),但我不确定是否可以从信号中获得多线程应用程序中所需的行为 当我配置设备文件描述符时,我想设置F_SETOWN(int),让内核向我设置为在SIGIO上阻塞的pthread发送信号 // Configure the s

我正在开发一个应用程序,它将在Linux上从串行/UART读取数据。我试图唤醒/取消阻止一个pthread,当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(内部)

将接收文件描述符fd上事件的SIGIO和SIGRUG信号的进程ID或进程组ID设置为arg中给定的ID。将进程ID指定为正值;进程组ID被指定为负值。最常见的情况是,调用进程将自己指定为所有者(即,arg被指定为getpid(2))


您可以通过调用pthread_self()传入pthread ID,而不是使用getpid()作为进程ID,这样只有特定线程才能获得信号吗?

在Linux上,您可以使用
F_SETOWN_EX
以特定线程为目标

从手册页:

在2.6.x内核(包括内核)中,以下情况是正确的 2.6.11:

如果在多线程进程中给F_SETSIG一个非零值 使用支持以下功能的线程库运行 端口线程组(例如NPTL),则给F_SETOWN的正值具有不同的含义:而不是 作为标识整个进程的进程ID,它是标识进程中特定线程的线程ID 过程因此,可能需要将getId(2)的结果而不是getpid(2)传递给 使用F_SETSIG时获得合理的结果。(在当前的Linux线程实现中,主线程的 线程ID与其进程ID相同。这意味着一个单线程程序可以同样使用gettid(2) 但是,请注意,本段中的语句不适用于 为套接字上的带外数据生成的SIGURG信号:该信号始终发送到进程或进程 进程组,取决于给定给F_SETOWN的值

上述行为是在Linux2.6.12中意外删除的,不会发生 恢复原状。从Linux 2.6.32开始,使用 F_SETOWN_EX以特定线程的SIGIO和SIRGURG信号为目标

Linux需要一个
pid/tid
(从内核的角度来看,线程id;Linux通常只调用pid,即使它们标识的是线程而不是进程),而不是
pthread\t

Pthread实现通常会在内部以特定于实现的方式将
Pthread\u t
映射到
pids
,您可以攻击特定的实现来获得它

或者,您可以包装
pthread\u create
以在创建线程时插入pthread\u t-to-pid映射哈希表条目,以便以后可以将
pthread\u t
s映射到
pid
s,而不依赖于pthread实现


(您可以使用
syscall(SYS\u gettid)
获取当前线程的pid)。

谢谢您的指针!当我阅读手册页时,我错过了它(DOH!)。我会试一试,让你知道它是否适合我。