0

問題はかなり単純なものに違いありませんが..それが何であるかわかりません。しばらくの間、「alaarm」を出力し続ける必要がありますが、それは一度だけ実行され、その後プログラムは終了します。

#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <signal.h>

void onAlarm();

void setupAlarm() {
 signal(SIGALRM, onAlarm);
 alarm(1);
}

void onAlarm() {
 setupAlarm();
 printf("alarmmmmmmmmmmmmmmmmm\n");
}

void main()
{
 setupAlarm();
 sleep(1000);
}

ここで何が問題なのですか?を取り出すsleep(1000)と、プログラムは即座に終了します (つまり、「alaaarm」が 1 つも表示されません)。

答え

OK、次のコードが機能します。

void onAlarm() {
    printf("alarmmmmmmmmmmmmmmmmm\n");
    alarm(1);
    sleep(1);
}

void main()
{
    signal(SIGALRM, onAlarm);
    alarm(1);
    sleep(2);
}

しかし、私はまだこれに手を巻いており、なぜこのようにコーディングする必要があるのか​​ を理解しようとしています.

4

4 に答える 4

1

おっと、私の前の答えは完全に間違っていました。onAlarm()が呼び出されたときに何が起こるかを調べます。

  1. シグナルハンドラをリセットし、

  2. それはアラームをリセットします

  3. 前のアラームをキャンセルして、再び待機を開始します。

の呼び出しに実際に到達するコード パスはprintfどれですか?

于 2010-12-12T02:47:50.270 に答える
1

sleep() がシグナルによって中断され、errno が EINTR に設定されます。つまり、最初のアラームの後、sleep() が返され、main の最後に到達するとプログラムが終了します。

シグナル ハンドラから printf を呼び出すべきではないことに注意してください。printf はシグナル非同期セーフではありません。

他にも落とし穴があるかもしれません、こちらをご覧ください

何も出力しない元のコードの動作を再現することはできませんが、何が起こっているのか知りたい場合は、straceまたは同様のツールでプログラムを実行してください。

于 2010-12-12T03:32:30.977 に答える
0

私はあなたのプログラムについて知りませんが、これは私にとってはうまくいきます(ここから取られたコード):

#include <unistd.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>

void catch_alarm (int sig);
void setupAlarm();

/* This flag controls termination of the main loop. */
volatile sig_atomic_t keep_going = 4;


/* The signal handler just clears the flag and re-enables itself. */
void catch_alarm (int sig) {
    keep_going--;
    printf("Alarm!!\n");

    if (keep_going) {
        setupAlarm();
    }
}

void setupAlarm() {
    alarm(1);
    sleep(1);
}

int main (int argc, char **argv) {
    signal(SIGALRM, catch_alarm);
    setupAlarm();

    return EXIT_SUCCESS;
}

これは 4Alarm!を出力して終了します。

同じ結果を得るには、sleep(1);をに置き換えることができます。while (keep_going);main

問題はalarm、プログラムのプロセス ID 内で実行されないことです。そのため、アラーム信号が発生したかどうかに関係なく、プログラムが終了する可能性があります。ただし、sleepプログラムのプロセスを n 秒間保留にしてから続行します。プロセスを「一時停止」する方法や、アラームを待っている間プロセスを維持する方法がなければ、実行する必要があったすべての処理を実行して終了します。sleep()、awhile (...)など、およびを使用せずにスレッドを使用しても、pthread_join()プロセスはアラーム信号を待たずに終了 (終了) します。そのため、シグナルが発生するのを待っている間、何らかの方法でプロセスを維持する必要があります。そうしないと、プロセスは機能しません。

于 2010-12-12T03:08:20.700 に答える
0

まず、環境に 1 秒後に SIGALRM を生成し、1 秒後に終了するように指示します。待機時間を 2 秒に増やしてみてください。

于 2010-12-12T02:51:58.710 に答える