0

このプログラムは、

親は、子が戻るのを無期限に待つだけです (ヒント、waitpid)。b. 子供は 2 つのシグナル ハンドラー (ヒント、シグナル) を設定し、5 分間スリープ状態になります。私。最初のシグナル ハンドラーは USR1 シグナルをリッスンし、それを受信すると次の処理を行います。 1. スレッドを作成します (ヒント、pthread_create)。a. 基本的に、スレッドが行う必要があるのは、「こんにちは」と 60 秒間スリープすることだけです。ii. 2 番目のシグナル ハンドラーは USR2 シグナルをリッスンし、それを受信すると次の処理を行います。 1. スレッドを破棄します (ヒント、pthread_cancel)。

このプログラムは、スレッドを作成する最初のシグナルを受信すると、「[スレッド] 1 分間スリープ中 [スレッド] 1 分間スリープ中」を出力して終了し、2 番目のシグナルを待機しません。何が間違っていますか?

#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <pthread.h>
#include <signal.h>

pthread_t thread;

void* temp()
{
    printf("[thread] hello professor\n");
    printf("[thread] sleeping for 1 minute\n");
    sleep(60);
}
void handle_USR1(int x)
{
    int s;
    printf("[signal] creating the thread\n");
    s = pthread_create(&thread, NULL, &temp, NULL);
}

void handle_USR2(int x)
{
    int s;
    printf("[signal] destroying the thread\n");
    s = pthread_cancel(thread);
}

int main(void)
{
    int status = 0;

    if(fork() != 0)
    {
     printf("[parent] waiting.....\n");
     waitpid(-1, &status, 0);
    }
    else
    {
     printf("[child] to create the thread: kill -USR1 %d\n", getpid());
     printf("[child] to end the thread: kill -USR2 %d\n", getpid());
     printf("[child] setting up signal handlers\n");

     signal(SIGUSR1, handle_USR1);
     signal(SIGUSR2, handle_USR2);

     printf("[child] waiting for signals\n");
     sleep(300);
    }
    return (0);
}
4

3 に答える 3

0

わかりました、何が起こっているのかわかりました。

シグナルを送信する場合、マスキングによって特定のスレッドに向けずにシグナルを送信すると、プロセス内の任意のスレッドがシグナルを取得できます。SIGUSR1 が配信さmainれると、子が吹き飛ばされsleep、メインスレッドが終了して、ハンドラーで作成されたスレッドが強制終了されます。

ここには、シグナルを単一のスレッドに送信する方法、および/またはsigactionシステムコールを再起動する方法をカバーする多くの質問があります。

于 2013-10-17T03:46:01.080 に答える
0

の後にa を配置pthread_joinしますpthread_create

于 2013-10-17T03:27:23.533 に答える