向C中的pthread发送和捕获信号

gva*_*o87 11 c multithreading pthreads process

我知道如何使用该kill(pid_t pid, int sig)函数将信号发送到C中的子进程.那么向线程发送信号呢?可能吗?.如果是这样,如何捕获"子"线程上的信号.例如,如果主线程向我发送终止信号,我怎么能在另一个线程中捕获它.

Bla*_*iev 8

使用POSIX线程,您可以使用函数pthread_cond_waitpthread_cond_signal.

int pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex)
int pthread_cond_signal(pthread_cond_t *cond)
Run Code Online (Sandbox Code Playgroud)

发出信号的线程应该在pthread_cond_wait调用时阻塞,直到另一个线程使用pthread_cond_signal相同的条件变量发送信号.

考虑到与传递给进程的信号的类比,这有点不同,因为已发出信号的线程已经暂停其执行等待信号,这与仅被中断并继续进行的进程不同.

  • 这与信号有很大不同.虽然我同意这通常是一种更好的方法,但我认为`pthread_kill'是OP问题的答案. (7认同)
  • @R ..:实际上问题不是很清楚,我认为作者不是要求将OS信号传递给特定线程,而是要求在线程之间发送信号. (2认同)

Jon*_*ler 7

信号作为一个整体发送到一个进程.发送到进程的每个信号由单个线程(代表整个程序)接收.存在每线程信号掩码,其影响特定线程是否有资格处理特定信号.

所以,你需要一个信号处理程序 - 可能只在一个线程中.但是请注意,在线程的信号处理程序中你应该做的事情有限制.警惕远远超出标准所做的承诺(这是最小的).

但是,pthread_kill()只要当前线程可以识别(有权访问pthread_t标识)仍在进程内执行的线程的线程ID(),该函数就可用于向其他线程发送信号.您可能决定使用与最初捕获的信号不同的信号编号将信号中继到其他线程(因此一个线程接收外部信号,但许多线程接收内部信号).或者您可以使用另一个Pthread同步或通信原语而不是信号.