⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sigsuspend.c

📁 这是一个介绍 linux 编程知识的文章。
💻 C
字号:
#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 + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -