信号的阻塞:通过sigprocmask()将信号集sigset_t中的信号设置为阻塞。SIG_BLOCK是指对相应信号的“递送阻塞”,内核在递送一个原来被阻塞的信号给进程时(而不是在产生该信号时),才决定对它的处理方式,那么进程在信号递送给它之前仍可改变对该信号的动作。

一个信号的"生命周期"为:产生(generation)、未决(pending)、递送(delivery)

如果将信号设置为阻塞,那么,在信号产生和递送之间的时间间隔内,称信号是未决的(pending)。

如果信号被设置成阻塞,且该信号的动作是系统默认动作或捕获该信号,当该信号产生后,则进程将此信号的状态保持为未决(pending)状态,直到对该信号解除了阻塞或将该信号的动作改为忽略。

sigpending函数的作用是获取被设置为SIG_BLOCK的信号集。

 static void sig_quit(int signo)
{
printf("111caught SIGQUIT\n");
if (signal(SIGQUIT, SIG_DFL)==SIG_ERR)
{
printf("can't reset SIGQUIT\n");
}
}
 int main(int argc, char** argv)
{
sigset_t newmask, oldmask, pendmask; if (signal(SIGQUIT, sig_quit) == SIG_ERR)
{
printf("can't catch SIGQUIT\n");
return -;
} //block SIGQUIT and save cureent signal mask
sigemptyset(&newmask);
sigaddset(&newmask, SIGQUIT); if (sigprocmask(SIG_BLOCK, &newmask, &oldmask) < )//阻塞SIGQUIT信号
{
printf("SIGBLCOK error\n");
return -;
}
printf("newmask:%x, oldmask:%x\n", newmask, oldmask); sleep(); if (sigpending(&pendmask)<)
{
printf("sigpending error\n");
return -;
}
printf("pendmask:%x\n", pendmask); if (sigismember(&pendmask, SIGQUIT))
printf("SIGQUIT pending\n"); if (sigprocmask(SIG_SETMASK, &oldmask, NULL))//解除阻塞
{
printf("sigprocmask error\n");
return -;
}
printf("222SIGQUIT unblock\n"); sleep(); return ;
}

运行结果为:

1. 当在第一个sleep 5s期间,Ctrl+\ 产生SIGQUIT信号时:

因为在sleep期间产生了SIGQUIT信号,那么此时该信号的状态时pending的,当该信号被设置为不阻塞后,即解除阻塞后,立即捕获该信号。从输出中可以看出,sig_quit中的printf语句先执行,然后再执行sigprocmask之后的printf语句。

2. 如果在第一个sleep 5s期间,不产生SIGQUIT信号,显然,sigpending的输出为0。

从结果中可以看到,本次pendmask为0,而上次pendmask为4。

SIG_BLOCK是指对相应信号的“递送阻塞”,内核在递送一个原来被阻塞的信号给进程时(而不是在产生该信号时),才决定对它的处理方式,那么进程在信号递送给它之前仍可改变对该信号的动作。

 static void sig_quit(int signo)
{
printf("111caught SIGQUIT\n");
if (signal(SIGQUIT, SIG_DFL)==SIG_ERR)
{
printf("can't reset SIGQUIT\n");
}
}
 static void sig_quit2(int signo)
{
printf("xxxcaught SIGQUIT\n");
if (signal(SIGQUIT, SIG_DFL)==SIG_ERR)
{
printf("can't reset SIGQUIT\n");
}
}
 int main(int argc, char** argv)
{
sigset_t newmask, oldmask, pendmask; if (signal(SIGQUIT, sig_quit) == SIG_ERR)
{
printf("can't catch SIGQUIT\n");
return -;
} //block SIGQUIT and save cureent signal mask
sigemptyset(&newmask);
sigaddset(&newmask, SIGQUIT); if (sigprocmask(SIG_BLOCK, &newmask, &oldmask) < )//阻塞SIGQUIT信号
{
printf("SIGBLCOK error\n");
return -;
}
printf("newmask:%x, oldmask:%x\n", newmask, oldmask); sleep(); if (signal(SIGQUIT, sig_quit2) == SIG_ERR)
{
printf("can't catch SIGQUIT\n");
return -;
} if (sigpending(&pendmask)<)
{
printf("sigpending error\n");
return -;
}
printf("pendmask:%x\n", pendmask); if (sigismember(&pendmask, SIGQUIT))
printf("SIGQUIT pending\n"); if (sigprocmask(SIG_SETMASK, &oldmask, NULL))
{
printf("sigprocmask error\n");
return -;
}
printf("222SIGQUIT unblock\n"); sleep(); return ;
}

运行结果为:

在line24中,又重新设置的SIGQUIT的信号处理程序。

如果信号被设置成阻塞,且该信号的动作是系统默认动作或捕获该信号,当该信号产生后,则进程将此信号的状态保持为未决(pending)状态,直到对该信号解除了阻塞或将该信号的动作改为忽略

 int main(int argc, char** argv)
{
sigset_t newmask, oldmask, pendmask; if (signal(SIGQUIT, sig_quit) == SIG_ERR)
{
printf("can't catch SIGQUIT\n");
return -;
} //block SIGQUIT and save cureent signal mask
sigemptyset(&newmask);
sigaddset(&newmask, SIGQUIT); if (sigprocmask(SIG_BLOCK, &newmask, &oldmask) < )//阻塞SIGQUIT信号
{
printf("SIGBLCOK error\n");
return -;
}
printf("newmask:%x, oldmask:%x\n", newmask, oldmask); sleep(); if (sigpending(&pendmask)<)
{
printf("sigpending error\n");
return -;
}
printf("pendmask:%x\n", pendmask); if (sigismember(&pendmask, SIGQUIT))
printf("SIGQUIT pending\n"); if (signal(SIGQUIT, SIG_IGN) == SIG_ERR)
{
printf("can't catch SIGQUIT\n");
return -;
}
printf("SIGQUIT IGNORE"); sleep(); return ;
}

运行结果为:

sigpending的更多相关文章

  1. Linux进程间通信(二):信号集函数 sigemptyset()、sigprocmask()、sigpending()、sigsuspend()

    我们已经知道,我们可以通过信号来终止进程,也可以通过信号来在进程间进行通信,程序也可以通过指定信号的关联处理函数来改变信号的默认处理方式,也可以屏蔽某些信号,使其不能传递给进程.那么我们应该如何设定我 ...

  2. 信号之sigpending函数

    sigpending函数返回信号集,其中的各个信号对于调用进程是阻塞的而不能递送,因而也一定是当前未决的.该信号集通过set参数返回.(这些信号是已经产生的信号,但因为信号屏蔽字中对其设置了屏蔽位,从 ...

  3. ZT sigprocmask,sigpending函数

    sigprocmask,sigpending函数 分类: LINUX 2012-02-02 16:39 905人阅读 评论(0) 收藏 举报 signalredhatnulllinux [sigpro ...

  4. linux c编程:信号(三) sigprocmask和sigpending函数

    信号源为目标进程产生了一个信号,然后由内核来决定是否要将该信号传递给目标进程.从信号产生到传递给目标进程的流程图如下图所示: 进程可以阻塞信号的传递.当信号源为目标进程产生了一个信号之后,内核会执行依 ...

  5. sigprocmask, sigpending, sigsuspend的用法

    sigset_t set sigemptyset(&set) :清空阻塞信号集合变量 sigfillset(&set) :添加所有的信号到阻塞集合变量里 sigaddset(& ...

  6. sigprocmask , sigpending 和 sigsuspend函数

    转自 http://blog.csdn.net/elbort/article/details/7594772 sigprocmask函数:功能描述:设定对信号屏蔽集内的信号的处理方式(阻塞或不阻塞). ...

  7. Linux C 收藏

    某招聘要求:熟悉高性能分布式网络服务端设计开发,熟悉epoll.多线程.异步IO.事件驱动等服务端技术: <UNIX环境高级编程(第3版)>apue.h等源码文件的编译安装 <UNI ...

  8. linux c/c++

    string 字符串操作 操作数的都是 ( char * )型,操作数必须是指向字符串的指针("a"),不能是字符('a'),操作时不考虑末尾的'\0'. size_t strle ...

  9. 使用GDB 追踪依赖poco的so程序,core dump文件分析.

    前言 在windows 下 系统核心态程序蓝屏,会产生dump文件. 用户级程序在设置后,程序崩溃也会产生dump文件.以方便开发者用windbg进行分析. so,linux 系统也有一套这样的东东- ...

随机推荐

  1. 洛谷 P2742 [USACO5.1]圈奶牛Fencing the Cows

    题目描述 农夫约翰想要建造一个围栏用来围住他的奶牛,可是他资金匮乏.他建造的围栏必须包括他的奶牛喜欢吃草的所有地点.对于给出的这些地点的坐标,计算最短的能够围住这些点的围栏的长度. 输入输出格式 输入 ...

  2. Java小问题的解决方法系列

    1)IDEA中文乱码,解决方法:http://blog.csdn.net/zht666/article/details/8953516 2)卸载OpenJdk,http://my.oschina.ne ...

  3. 获取OS X中App Store更新后的安装包(如XCode)

    如果宿舍有好几个人需要更新一些大的软件,如XCode,会占用很大的带宽.   为了节省带宽,我们可以在1台电脑上更新完后,获取存放在系统暂存区的更新的安装包,然后通过局域网或Airdrop的方式轻松分 ...

  4. SpringBoot拦截器中service或者redis注入为空的问题

    原文:https://my.oschina.net/u/1790105/blog/1490098 这两天遇到SpringBoot拦截器中Bean无法注入问题.下面介绍我的思考过程和解决过程: 1.由于 ...

  5. JET 调用后端Rest Service

    调用Rest Service可以基于两种方式: 一种是oj.Collection.extend 一种是$.ajax CORS问题 但在调用之前,首先需要解决rest service的CORS问题.(跨 ...

  6. Office 2007 SP3 正试版补丁包下载

    这仅仅是下载补丁包.下载地址也是微软官网的.以下是MD5是我下载后校验的. 2007 Microsoft Office 套件 Service Pack 3 (SP3) 文件名: office2007s ...

  7. linux中查找文件属于那个软件包的方法

    一.linux中查找文件属于那个软件包的方法 [root@salt prod]# whereis htpasswdhtpasswd: /usr/bin/htpasswd /usr/share/man/ ...

  8. [Microsoft][SQLServer 2000 Driver for JDBC]Error establishing socket错误解决方法总结

    今天做一个特殊的业务处理,用JDBC连接SQLServer数据库载入驱动的时候,报例如以下错误: java.sql.SQLException: [Microsoft][SQLServer 2000 D ...

  9. ActiveMQ消息游标 --转载

    转:http://blog.csdn.net/m13321169565/article/details/8081358 在Activemq以前的版本中,broker会把待发送的消息保存在内存中.这种方 ...

  10. 倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)人机界面Paintbuffer Overflow怎么办

    当在界面上绘制了太多元素时,点击运行会在左上角弹出对话框提示内容容量不够   在英文版的说明中,点击Visualization Manager就可以进行设置     更多教学视频和资料下载,欢迎关注以 ...