linux 信号屏蔽

原创 2015年07月10日 13:16:42
<span style="font-size:18px;">#include <sys/types.h>
#include <unistd.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>

/*
sigemptyset(&newmask);//获取空屏蔽信号集
sigfillset(&newmask);//获取屏蔽了所有信号的屏蔽信号集,除了那两个SIGKILL SIGSTOP
sigpending(&pendmask);//获取进程中当前的屏蔽信号集

sigaddset(&newmask, SIGQUIT);//往空屏蔽信号集加入SIGQUIT
(sigprocmask(SIG_BLOCK, &newmask, &oldmask) < 0)//并集
(sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0)//设置会原来的屏蔽信号集
(sigismember(&fillmask, SIGQUIT))//判断SIGQUIT是否在当前的屏蔽信号集中
*/

static void	sig_quit(int);

int
main(void)
{
	sigset_t	newmask, oldmask, pendmask,fillmask;

	if (signal(SIGQUIT, sig_quit) == SIG_ERR)//设置信号处理函数
		perror("can't catch SIGQUIT");

	/*
	 * Block SIGQUIT and save current signal mask.
	 */
	sigemptyset(&newmask);//获取空屏蔽信号集
	sigaddset(&newmask, SIGQUIT);//往空屏蔽信号集加入SIGQUIT
	if (sigprocmask(SIG_BLOCK, &newmask, &oldmask) < 0)//并集
		perror("SIG_BLOCK error");

	sleep(5);	/* SIGQUIT here will remain pending */
    //睡眠期间按下多次 ctrl+\   未决信号集中之保留一次

	if (sigpending(&pendmask) < 0)//获取进程中当前的屏蔽信号集
		perror("sigpending error");
	if (sigismember(&pendmask, SIGQUIT))//判断SIGQUIT是否在当前的屏蔽信号集中
		printf("\nSIGQUIT pending\n");

	/*
	 * Restore signal mask which unblocks SIGQUIT.
	 */
	if (sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0)//设置会原来的屏蔽信号集,由于SIGQUIT保留着一个未决信号,所以这里触发了信号处理函数,SIGQUIT变回默认处理
		perror("SIG_SETMASK error");
	printf("SIGQUIT unblocked\n");

	sleep(5);	/* SIGQUIT here will terminate with core file */ //在此期间按下  ctrl+\ 执行信号处理函数 ,调用默认处理。game over!
	
	printf("fillmask test\n");

	if (sigfillset(&fillmask) < 0)//获取屏蔽了所有信号的屏蔽信号集,除了那两个SIGKILL SIGSTOP
		perror("sigfillset error\n");
	if (sigismember(&fillmask, SIGQUIT))//判断SIGQUIT是否在当前的屏蔽信号集中
		printf("\nSIGQUIT pending\n");//在
	if (sigprocmask(SIG_SETMASK,&fillmask , &oldmask) < 0)//设置屏蔽所有
			perror("fillmask error\n");

	sleep(5);
	if (sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0)//如果在fillmask测试期间有按下ctrl+\,则下面不会睡眠5秒了,执行了SIGQUIT的默认处理函数
		perror("SIG_SETMASK error\n");

	sleep(5);
	exit(0);
}

static void
sig_quit(int signo)
{
	printf("caught SIGQUIT\n");
	//if (signal(SIGQUIT, SIG_DFL) == SIG_ERR)
	//	perror("can't reset SIGQUIT");
}
</span>

在linux进程中的信号屏蔽

       原创文章,转载请注明出处,谢谢!               作者:清林,博客名:飞空静渡 在linux的进程中可以接收到各种的信号,并且如果你不对信号进行处理,linux中的进程就会采...
  • fjb2080
  • fjb2080
  • 2010年01月11日 14:28
  • 9187

Linux下忽略信号SIGPIPE的方法

最近为测试自己写好的一个服务器,zi
  • woxiaozhi
  • woxiaozhi
  • 2014年10月30日 18:55
  • 8981

linux信号屏蔽字

一个进程的信号屏蔽字规定了当前阻塞而不能递送给该进程的信号集。调用函数sigprocmask可以检测或更改其信号屏蔽字,或者在一个步骤中同时执行这两个操作。 #include int sigp...
  • messiran10
  • messiran10
  • 2016年05月09日 17:39
  • 1014

linux信号屏蔽字

一个进程的信号屏蔽字规定了当前阻塞而不能递送给该进程的信号集。调用函数sigprocmask可以检测或更改其信号屏蔽字,或者在一个步骤中同时执行这两个操作。 #include int sigp...
  • messiran10
  • messiran10
  • 2016年05月09日 17:39
  • 1014

Linux c 屏蔽信号、切换信号

信号导致的问题 不是任何信号我们都需要的,如果遇到我们不想处理的信号,我们怎么避免这个信号?   1.      信号屏蔽     intsigprocmask(int how,//操作方式     ...
  • Y_23k_bug
  • Y_23k_bug
  • 2013年08月12日 13:35
  • 1077

信号阻塞与屏蔽:SIG_BLOCK, SIG_UNBLOCK, SIG_MASK区别与使用

1. sigprocmask函数提供屏蔽和解除屏蔽信号的功能。    从而实现关键代码的运行不被打断。      函数声明如下:        #include       int s...
  • zxygww
  • zxygww
  • 2014年05月16日 14:31
  • 1850

Unix环境高级编程(阅读笔记)----信号集、信号屏蔽函数sigprocmask

信号屏蔽字是指一个进程中当前阻塞而不能够递送给该进程的信号集。 信号集则是一个能表示多个信号的集合的一种数据类型,为sigset_t。 与信号集设置相关的函数有如下几个: //  下列四个函...
  • a2796749
  • a2796749
  • 2016年05月12日 15:48
  • 365

linux信号屏蔽

1、自定义SIGNAL函数。可设置在执行信号处理函数过程中,是否能被其它信号或者与当前信号相同信号中断。 2、使用sigprocmask函数进行信号屏蔽。 3、信号屏蔽过程中,向进程发送多个不同的信号...
  • weixin_33398032
  • weixin_33398032
  • 2017年07月31日 15:45
  • 78

(四)实验2-3-3 信号处理总结以及Linux下支持的信号列表

一、例子 1.代码: 2.编译后运行如下: 可以看出进程正在等待信号SIGBUS 3.发送SIGBUS信号---用kill 首先我们看一下kill用法:在终端输入man ki...
  • chenqiai0
  • chenqiai0
  • 2013年04月06日 14:36
  • 1259

Linux中如何屏蔽信号

本篇文章主要学习Linux的信号处理机制,着重学习屏蔽信号部分。屏蔽信号处理的两种方式类似于信号的捕获,一种方式是直接对其设置,另一种方式是先获得描述符的掩码,然后对其设置操作。...
  • u013457167
  • u013457167
  • 2017年11月20日 20:49
  • 177
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:linux 信号屏蔽
举报原因:
原因补充:

(最多只允许输入30个字)