信号可以在任何线程或主程序本身中接收。 我从主程序创建了一个辅助线程。所以我的程序中有两个线程1.主线程(进程本身)2。辅助线程。我只是希望每当信号到达我的辅助线程时,应该将信号发送到我的主线程(程序)。我正在使用pthread_kill(main_threadid,sig)从辅助线程内的信号处理程序寄存器发送信号。但。我观察每次信号发送到主线程接收到辅助子本身,信号处理器落入接收发送信号的循环。
#include <pthread.h>
#include <signal.h>
#include <stdio.h>
#include <unistd.h>
// global variable
pthread_t main_threadId;
struct sigaction childpsa;
// Signal Handler for Auxiliary Thread
void signalHandler_Child(int param)
{
printf("Caught signal: %d in auxiliary Thread", param);
pthread_kill(main_threadId, param);
}
void *childFun(void *arg)
{
childpsa.sa_handler = signalHandler_Child;
sigaction(SIGTERM, &childpsa, NULL);
sigaction(SIGHUP, &childpsa, NULL);
sigaction(SIGINT, &childpsa, NULL);
sigaction(SIGCONT, &childpsa, NULL);
sigaction(SIGTSTP, &childpsa, NULL);
while (1) {
// doSomething in while loop
}
}
int main(void)
{
main_threadId = pthread_self();
fprintf(stderr, "pid to signal %d\n", getpid());
// create a auxiliary thread here
pthread_t child_threadId;
int err = pthread_create(&child_threadId, NULL, &childFun, NULL);
while (1) {
// main program do something
}
return 1;
}
说我正在使用其进程ID从终端发送SIGINT进行处理。
答案 0 :(得分:2)
来自Unix环境中的高级编程:
每个线程都有自己的信号掩码,但信号处理由进程中的所有线程共享。这个 表示单个线程可以阻止信号,但是当线程修改与给定相关联的操作时 信号,所有线程共享动作。因此,如果一个线程选择忽略给定信号,则另一个线程可以撤消 通过恢复默认处置或为信号安装信号处理程序来进行该选择。
sigaction
调用正在设置整个进程(以及该进程中的所有线程)的信号处理。
当您向进程发送信号时,任何未阻止信号的线程(但只有1个线程)都可以接收它(尽管从我有限的经验来看,通常首选主线程)。在你的代码中,主线程可能正在获取信号,运行信号处理程序,然后立即再次向自己发送信号。
如果您希望您的单个辅助线程处理您的进程的所有信号,您可以在主线程中使用pthread_sigmask来阻止有问题的信号:
sigset_t set;
sigemptyset(&set);
sigaddset(&set, SIGTERM);
sigaddset(&set, SIGHUP);
sigaddset(&set, SIGINT);
sigaddset(&set, SIGCONT);
sigaddset(&set, SIGTSTP);
pthread_sigmask(SIG_BLOCK, &set, NULL);
这将确保信号不会传递到该线程。如果在pthread_create之前执行此操作,则需要在辅助线程中取消阻止它们。
然后,您可以使用非信号线程间通信机制与主线程进行通信。