3

次のプログラムでは、一時停止が1回中断されますが、その後一時停止が戻ることはありません。一時停止を中断するようにアラームを設定したので、一時停止が戻らないのはなぜですか?

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

static void sig_alrm(int);
static jmp_buf env_alrm;


int main(int arc, char **argv)
{

    int x;
    x = setjmp(env_alrm);
    printf("setjmp was created with return value: %d\n", x);

    if(signal(SIGALRM, sig_alrm) == SIG_ERR)
    {
            printf("Error settting SIGALRM\n");
            exit(1);
    }


    if((x!= 0) && (x!=1))
    {

            printf("Error setting setjmp\n");
            exit(1);
    }

    printf("Line next to setjmp\n");
    x = alarm(2);
    printf("Alarm set for 2 seconds, remaning secs from previous alarm: %d\n");
    pause();
    printf("Line next to pause()\n");
    alarm(0);
    return 0;
}

static void sig_alrm(int signo)
{
    longjmp(env_alrm, 1);
}

これが出力であり、最後の行はアプリケーションが一時停止する場所を示しています

setjmp was created with return value: 0
Line next to setjmp
Alarm set for 2 seconds, remaining secs from previous alarm: 0
setjmp was created with return value: 1
Line next to setjmp
Alarm set for 2 seconds, remaining secs from previous alarm: 0
4

2 に答える 2

4

sigsetjmp()代わりにandを使用siglongjmp()して、Linux ではデフォルトで保存されないシグナル マスクを保存および復元し、man setjmp()から保留中のシグナルをクリアします。

POSIX では、setjmp() がシグナル マスクを保存するかどうかを指定していません。System V ではそうではありません。デフォルトでは、Linux/glibc は System V の動作に従います。シグナル マスクをポータブルに保存および復元する場合は、 sigsetjmp() および siglongjmp() を使用します。

注:あなたが何を達成しようとしているのかはわかりませんが、あなたのコードは無限ループで実行されることになっているように見えlongjmp()ますsetjmp().

于 2012-11-27T17:30:00.183 に答える
0

http://linux.die.net/man/2/pauseによると:

pause() は、シグナルが捕捉され、シグナル捕捉関数が返された場合にのみ戻ります。

あなたの場合、それは決して返されませんlongjmp

于 2012-11-27T17:27:04.830 に答える