シグナルは、任意のスレッドまたはメインプログラム自体で受信できます。 メインプログラムから補助スレッドを1つ作成しました。私のプログラムには2つのスレッドがあります。1.メインスレッド(プロセス自体)2.補助スレッド。私はシグナルが私の補助スレッドに到着するたびに、それが私のメインスレッド(プログラム)にシグナルを送るべきであることを望んでいます。私はpthread_kill(main_threadid、sig)を使用してシグナルハンドラのレジスタから補助スレッド内のシグナルを送信しています。しかし。私はシグナルが補助子自身に受信されたメインスレッドに送信されるたびに観測し、シグナルハンドラは送信シグナルを受信するループに入ります。pthread_kill()は、メインスレッド(メインプログラム)に信号を送信しません。
#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を送信していると言っています。
私はあなたが何をしようとしているのか正確には分かりませんが、スレッド間通信にグローバル信号を使用するのはおそらく正しいアプローチではありません。 – thrig