在linux进程中的信号屏蔽
来源:互联网 发布:广州恒大淘宝球员 编辑:程序博客网 时间:2024/05/16 02:02
原创文章,转载请注明出处,谢谢!
作者:清林,博客名:飞空静渡
在linux的进程中可以接收到各种的信号,并且如果你不对信号进行处理,linux中的进程就会采用默认的处理方式处理,比如ctrl-c的信号,进程对它的处理就是终止进程的执行。
在linux中,我们也可以在进程中屏蔽掉某些信号,使进程不去处理这些信号,但其中的SIGKILL和SIGSTOP是不能被阻塞的。
在这里先介绍几个信号的函数:
int sigempty(sigset_t *set); // 清空信号集set
int sigfillset(sigset_t *set); // 填满信号集,即让set包含所有的信号
int sigaddset(sigset_t *set, int signo); // 在set中增加signo信号
int sigdelset(sigset_t *set, int signo); // 在set中去掉signo信号
int sigismember(sigset_t *set, int signo); // 信号signo是否在信号集set中
int sigprocmask(int how, const sigset_t set, sigset_t oset); // 若oset非空,则进程的当前信号屏蔽字通过oset返回,若set是一个非空指针,着参数how指示如何修改当前信号的屏蔽字,how可以取三个值:
SIG_BLOCK:增加一个信号。
SIG_UNBLOCK:解除一个信号。
SIG_SETMASK:该进程的信号将被set信号集取代。
int sigpengding(sigset_t *set); // 该函数返回信号集,该信号通过set参数返回。
以上函数都在#include <signal.h> 头文件中。
下面用《unix环境高级编程》里的一个例子说明一下,代码有所修改,先看代码(main.c,里面有个人对代码的注释):
编译: gcc main.c
生成:a.out
运行:./a.out
输出如下(ubuntu9.10):
^/
SIGQUIT pending
caught SIGQUIT
SIGQUIT unblocked
^/退出
下面解释一下输出:
^/ 在第一次sleep(5)的5秒中内产生信号一次(按ctrl+/)
SIGQUIT pending 从sleep返回后
caught SIGQUIT 在信号处理函数中
SIGQUIT unblocked 从sigprocmask返回后
^/退出 再次产生信号
我们对着程序来看下输出。
在我们设置SIGQUIT屏蔽字和恢复进程的信号集这段时间,我们产生的SIGQUIT信号,我们的进程并没去处理,所以输出了SIGQUIT pending 。
在我们恢复进程的信号集后,我们进程就扑捉到了我们刚才产生的信号,因而就输出了caught SIGQUIT,在sig_quit函数中,我们恢复了SIGQUIT的默认处理方式(即终止进程运行),进程当我们再次产生SIGQUIT信号,进程就退出了。
当我们产生进程时,一些unix系统会对进程中要处理的信号进行排队,我们的进程会对信号队列中的信号进行处理。我们再运行一下刚才的程序,在第一次sleep(5)的5秒中内产生信号10次信号,看下会怎么样,下面是我的输出:
^/^/^/^/^/^/^/^/^/^/
SIGQUIT pending
caught SIGQUIT
SIGQUIT unblocked
^/退出
下面解释一下输出:
^/^/^/^/^/^/^/^/^/^/ 在第一次sleep(5)的5秒中内产生信号10次信号
SIGQUIT pending 从sleep返回后
caught SIGQUIT 从sigprocmask返回后
SIGQUIT unblocked 从sigprocmask返回后
^/退出 再次产生信号
这里可以看到linux系统对没有对信号进行排队,产生10次信号,只处理一次。
在上面的例子中,我们用signal函数来指定信号的处理函数,用sigprocmask来指定信号屏蔽字,其实这些都可以在一个函数中解决,它就是sigaction,推荐使用sigaction函数。
- 在linux进程中的信号屏蔽
- linux进程中的信号屏蔽
- 在linux进程中的信号屏蔽 http://blog.csdn.net/fjb2080/article/details/5174306
- 【Linux】中的进程信号三张表
- Linux高级编程 第六章 进程控制 信号 定时器 信号操作 信号屏蔽
- linux 信号屏蔽
- linux信号屏蔽字
- Linux--信号屏蔽
- linux信号屏蔽
- linux中的线程屏蔽码和进程屏蔽码
- 子进程屏蔽信号设置
- Linux--信号处理:在某个信号发生时屏蔽其他的信号
- 【原创】《Linux高级程序设计》杨宗德著 - 进程管理与程序开发 - 信号集与屏蔽信号
- Linux中的僵尸进程和信号
- 信号中断处理函数中的信号屏蔽
- linux中的信号2——进程如何处理信号?
- linux之信号屏蔽pending
- Linux中如何屏蔽信号
- java 调用.net 的webservice,返回值为一维数组
- 最新发明:虚拟和现实搭桥的"第六感"
- Usage sample of unix Message Queues
- 要准备考研啦!
- spring 整合struts2
- 在linux进程中的信号屏蔽
- 用NET-SNMP软件包开发简单客户端代理
- 软件回归测试及其实践
- seo群聊天记录
- 活着的每一天都是特别的日子!
- js实现的双色平滑变化算法
- IP Alias Configuration: The New Way
- 写个Sqlite3到Lua的library
- spring form reference