sigsuspend.c

来自「这是一个介绍 linux 编程知识的文章。」· C语言 代码 · 共 75 行

C
75
字号
#include <stdio.h>
#include <errno.h>
#include <sys/types.h>
#include <signal.h>
#include <unistd.h>

static void sig_int (int);

void err_sys (const char* info)
{
        perror (info);
        exit (1);
}

void pr_mask (const char* str)
{
    sigset_t   sigset;
	int        errno_save;

	errno_save = errno;    /* this function may be called by signal handler */
	if (sigprocmask (0, NULL, &sigset) < 0)
		    err_sys ("sigprocmask error");
		
	printf ("%s", str);

	if (sigismember (&sigset, SIGINT))  printf ("SIGINT  ");
	if (sigismember (&sigset, SIGQUIT)) printf ("SIGQUIT  ");
	if (sigismember (&sigset, SIGUSR1)) printf ("SIGUSR1  ");
	if (sigismember (&sigset, SIGALRM)) printf ("SIGALRM  ");

	printf ("\n");

	errno = errno_save;
}
	
int main (void)
{
        sigset_t  newmask, oldmask, zeromask;

        if (signal (SIGINT, sig_int) == SIG_ERR)
            err_sys ("signal (SIGINT) error");
        
        sigemptyset (&zeromask);
        
        sigemptyset (&newmask);
        sigaddset (&newmask, SIGINT);

        /* block SIGINT and save current signal mask */
        if (sigprocmask (SIG_BLOCK, &newmask, &oldmask) < 0)
            err_sys ("SIG_BLOCK error");
        
        /* critical region of code */
        pr_mask ("in critical region: ");

        /* allow all signals and pause */
        if (sigsuspend (&zeromask) != -1)
            err_sys ("sigsuspend error");
        pr_mask ("after return from sigsuspend: ");

        /* reset signal mask whick unblocks SIGINT */
        if (sigprocmask (SIG_SETMASK, &oldmask, NULL) < 0)
            err_sys ("SIG_SETMASK error");

        /* and continue processing ... */

        exit (0);
}

static void sig_int (int signo)
{
        pr_mask ("\nin sig_int: ");
        return;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?