3

在下面的程序中,暂停被中断一次,但之后暂停永远不会返回。我已经设置了闹钟来中断暂停,所以我很困惑为什么暂停永远不会返回?

#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()andsiglongjmp()来保存和恢复 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 回答