0

このプログラムは、

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

私のコードは正常にコンパイルされます。実行すると、何も起こりません。テストとしてそこに置いた最初のprintfでさえありません。私はそれを1時間じっと見つめていましたが、エラーはありません。なぜこれが実行されないのですか?

編集:これは現在実行されていますが、チャーリーに感謝しますが、スレッドを作成すると、「[スレッド] 1 m [スレッド] 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

2 に答える 2

1

すべての printf に改行 "\n" を追加します。それがないと、stdout はフラッシュせず、プログラムが動作していても動作していないように見えます。

また、 fork() の失敗をチェックすることをお勧めします。fork() は、失敗すると -1 を返し、errno を設定します。

于 2013-10-17T02:02:00.470 に答える