親スレッドから2つの子スレッドを作成したコードを記述しました。メインスレッドが終了した後に子スレッドが生きているのはなぜですか?
次に、これらの子スレッド内の別の端末からの信号を受信して、threadID
を印刷してスレッドを終了しました。
私には2つの質問があります。
子スレッドからの信号を受信しています。親スレッドの
threadID
をなぜ印刷していますか?親スレッドを終了した後、どのように子スレッドを生き延びることができますか?
コード:
最初の3行は3つのthreadID
Sであり:ここ
void sig_handler(int signo)
{
if (signo == 1){
printf("%d\n", pthread_self());
pthread_exit(NULL);
}
}
void* doSomeThing(void* arg)
{
printf("In function -> %d\n", pthread_self());
if (signal(1, sig_handler) == SIG_ERR)
printf("\ncan't catch SIGHUP\n");
while(1)
sleep(1);
return NULL;
}
int main(int argc, char *argv[])
{
printf("In function -> %d\n", pthread_self());
char *ch1;
pthread_t tid1, tid2;
ch1 = "random";
int ret1, ret2;
ret1 = pthread_create(&tid1, NULL, &doSomeThing, (void *) ch1);
ret2 = pthread_create(&tid2, NULL, &doSomeThing, (void *) ch1);
while(1)
sleep(1);
return 0;
}
は、端末に指定された出力の画像です。最初の1つはメインthreadID
で、次に2つのセカンダリスレッドです。
次に、threadID
は、次のコードブロックから印刷されます。
if (signo == 1){
printf("%d\n", pthread_self());
pthread_exit(NULL);
}
なぜこれが起こっていますか?
「signal」はスレッドで実際には機能しません。 –
これは、 'pthread_self()'関数が適切な 'threadID'を与えていないことを意味しますか? 'シグナル 'を受け取った後に呼び出されるので?? – jbsu32
@JishnuBanerjee 'pthread_self()'は、呼び出し元スレッドのスレッドIDを返します。しかし、本当の問題は、スレッドごとのシグナルハンドラを持つことができないということです。信号処理はプロセス全体に及ぶ。シグナルをブロックする方法については、リンクされたマニュアルページの例を参照してください。 –