int main(int argc,char *argv[])
{
	struct sigaction sa;

	print_sigmask(stdout,"Signal mask at startup: \n");
	sigemptyset(&sa.sa_mask);
	sa.sa_flags = 0;
	sa.sa_handler = handler;

	if (sigaction(SIGINT,&sa,NULL) == -1) {
		perror("sigaction failed");
		exit(-1);
	}

#ifdef USE_SIGSETJMP
	printf("Calling sigsetjmp to set a jump-point\n");
	if (sigsetjmp(senv,1) == 0) {
#else
	printf("Calling setjmp to set a jump-point\n");
	if (setjmp(env) == 0) {
#endif
		canJump = 1;
	} else {
		print_sigmask(stdout,"After jump from handler,signal mask is: \n");
	}

	for (;;)
		pause();
}
示例#2
0
文件: sigcont.c 项目: xirc/tlpi
int
main(int argc, char *argv[])
{
    int sleep_time;
    struct sigaction sa;
    sigset_t block_mask;

    sleep_time = (argc > 1) ? atoi(argv[1]) : 5;
    if (sleep_time <= 0) {
        fprintf(stderr, "sleep-time %s > 0\n", argv[1]);
        exit(EXIT_FAILURE);
    }

    sa.sa_handler = handler;
    sigemptyset(&sa.sa_mask);
    sa.sa_flags = 0;
    if (sigaction(SIGCONT, &sa, NULL) == -1) {
        perror("sigaction");
        exit(EXIT_FAILURE);
    }

    sigemptyset(&block_mask);
    sigaddset(&block_mask, SIGCONT);
    if (sigprocmask(SIG_BLOCK, &block_mask, NULL) == -1) {
        perror("sigprocmask");
        exit(EXIT_FAILURE);
    }
    printf("set signal mask SIGCONT\n");
    print_sigmask(stdout, "SIGNAL MASK:\n");

    printf("sleep %ds.\n", sleep_time);
    printf("type <Ctrl-Z>. Then, type 'kill -CONT %ld\n", (long) getpid());
    sleep(sleep_time);
    printf("sleep finished.\n");

    print_sigmask(stdout, "SIGNAL MASK:\n");
    print_pending_sigs(stdout, "PENDINGS:\n");
    printf("unset signal mask SIGCONT\n");
    if (sigprocmask(SIG_UNBLOCK, &block_mask, NULL) == -1) {
        perror("sigprocmask");
        exit(EXIT_FAILURE);
    }

    exit(EXIT_SUCCESS);
}
static void handler(int sig)
{
	printf("Received signal %d (%s)\n", sig, strsignal(sig));
	printf("signal mask is:\n");
	print_sigmask(stdout,NULL);

	if (!canJump) {
		printf("'env' buffer not yet set,doing a simple return");
		return;
	}

#ifdef USE_SIGSETJMP
	siglongjmp(senv,1);
#else
	longjmp(env,1);
#endif
}
示例#4
0
static void
handler(int sig)
{
    /* UNSAFE: This handler uses non-async-signal-safe functions
     * (printf(), strsignal(), print_sigmask(); see section 21.1.2) */
    printf("Received signal %d (%s), signal mask is:\n",
            sig, strsignal(sig));
    print_sigmask(stdout, NULL);
    if (!can_jump) {
        printf("'env' buffer not yet set, doing a simple return\n");
        return;
    }
#ifdef USE_SIGSETJMP
    siglongjmp(senv, 1);
#else
    longjmp(env, 1);
#endif
}