Ich habe einen Code geschrieben, wo ich zwei untergeordnete Threads aus dem übergeordneten Thread erstellt habe.Warum Child Threads lebendig nach dem Haupt Threads getötet werden?
Dann, mit dem Empfang eines Signals von einem anderen Terminal innerhalb dieser Kind-Threads, druckte ich die threadID
und verließen den Thread.
Ich habe 2 Fragen.
Ich erhalte das Signal vom untergeordneten Thread. Warum druckt es die
threadID
des übergeordneten Threads?Nachdem der Elternfaden getötet wurde, wie können die Kindfäden lebendig sein ??
Der Code:
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;
}
Hier ist das Bild des Ausgangsklemme gegeben:
Die ersten 3 Zeilen sind die 3 threadID
s. 1. ist der Main threadID
s, dann die zwei sekundären Threads.
Dann die threadID
s aus dem folgenden Codeblock gedruckt.
if (signo == 1){
printf("%d\n", pthread_self());
pthread_exit(NULL);
}
Warum passiert das ???
'Signal' funktioniert nicht wirklich mit Threads. –
Bedeutet das, dass die 'pthread_self()' Funktion nicht die richtige 'threadID' gibt ?? Wie heißt es nach dem Empfang des 'Signals'? – jbsu32
@JishnuBanerjee 'pthread_self()' gibt die Thread-ID des aufrufenden Threads an. Aber das wirkliche Problem ist, dass es nicht möglich ist, pro-Thread Signalhandler zu haben; Signalverarbeitung ist prozessweit. Ein Beispiel in der verlinkten Manpage zum Blockieren von Signalen. –