15信号sigaction
信号处理
信号值小于 SIGRTMIN 的信号 (1~31) 都是不可靠信号
某些unix版本中,调用信号函数处理后会自动恢复默认信号处理,所以在信号处理函数中还需要继续调用signal函数设置信号处理
这个问题在linux中并不存在
linux 信号处理使用 sigaction函数,
sigaction 与 signal
主要优点: sigaction 支持参数传递
简单运用,作用与signal相同
void simFun(int sig)
{
printf("receive sig=%d\n",sig);
}
void testSigaction()
{
printf("pid=%d\n",getpid());
struct sigaction act,old;
act.sa_handler=simFun;
sigaction(SIGUSR1,&act,&old);
while(1);
}
发出信号SIGUSR1,自动响应simFun处理函数。
信号处理
int sigaction(int sig, struct sigaction *act, struct sigaction *oldact)
sig :指定捕获的信号
act :指定捕获信号后的处理方式
oldact: 上一次指定的处理方式
信号处理
struct sigaction
{
#ifdef __USE_POSIX199309
union {
__sighandler_t sa_handler; /* void(*)(int) -- if SA_SIGINFO is not set. */
void (*sa_sigaction) (int sig, siginfo_t *, void *); /* Used if SA_SIGINFO is set. */
}__sigaction_handler;
# define sa_handler __sigaction_handler.sa_handler
# define sa_sigaction __sigaction_handler.sa_sigaction
__sigset_t sa_mask; /* 信号处理时,那些信号被阻塞 (默认为当前信号阻塞)*/
int sa_flags; /* 响应信号的其他行为,其中 SA_SIGINFO 标志位指定信号处理方法*/
void (*sa_restorer) (void); /*过时,不再使用. */
};
结构体参数:
sa_mask
sigaddset(&xx.sa_mask, SIGINT) 增加阻塞中断信号
sa_flags
SA_NOCLDSTOP (1) 子进程暂停时不发送SIGCHLD信号通知父进程,SIGSTOP SIGTSTP SIGTTIN SIGTTOU
SA_NOCLDWAIT (2) 子进程结束时,不变为僵尸进程,针对SIGCHLD信号
SA_SIGINFO (4) 使用sa_sigaction方法处理信号
SA_RESTART (0x10000000) 被信号中断的系统处理会自动重启
SA_NODEFER (0x40000000) 处理某信号时,这个信号不再阻塞, 可重入
SA_RESETHAND (0x80000000) 捕获信号后,这个信号恢复缺省处理
siginfo_t结构体:
siginfo_t {
int si_signo; /* Signal number */
int si_errno; /* An errno value */
int si_code; /* Signal code */
int si_trapno; /* Trap number that caused
hardware-generated signal
(unused on most architectures) */
pid_t si_pid; /* Sending process ID */
uid_t si_uid; /* Real user ID of sending process */
int si_status; /* Exit value or signal */
clock_t si_utime; /* User time consumed */
clock_t si_stime; /* System time consumed */
sigval_t si_value; /* Signal value */
int si_int; /* POSIX.1b signal */
void *si_ptr; /* POSIX.1b signal */
int si_overrun; /* Timer overrun count; POSIX.1b timers */
int si_timerid; /* Timer ID; POSIX.1b timers */
void *si_addr; /* Memory location which caused fault */
long si_band; /* Band event (was int in
glibc 2.3.2 and earlier) */
int si_fd; /* File descriptor */
short si_addr_lsb; /* Least significant bit of address
(since Linux 2.6.32) */
}
int sigqueue(pid, sig, union sigval sgv)
发送信号给进程,使用同 kill效果一样
不同于kill 的地方,多了一个信号参数, 只能向某个进程发送信号,不能向进程组发送信号
如:sigqueue(getpid(), SIGUSR1, sgv);给自己发SIGUSR1。
union sigval
{
int sival_int;
void* sival_ptr;
}
带参数的例子:
void complexFun(int sig,siginfo_t *info,void *ex)
{
sleep(3);
printf("receive sig=%d\n",sig);
printf("Sending process ID:%d\n",info->si_pid);
printf("Real user ID of sending process:%d\n",info->si_uid);
printf("extrc value:%d\n",info->si_value.sival_int);
}
void testSigaction()
{
printf("pid=%d\n",getpid());
struct sigaction act,old;
//act.sa_handler=simFun;
//sigaction(SIGUSR1,&act,&old);
sigaddset(&act.sa_mask,SIGINT);
act.sa_flags|=SA_SIGINFO;
act.sa_flags|=SA_NODEFER;
act.sa_sigaction=complexFun;
sigaction(SIGUSR1,&act,&old);
union sigval sgv;
sgv.sival_int=123;
sigqueue(getpid(), SIGUSR1, sgv);
while(1);
}
SA_NODEFER (0x40000000) 处理某信号时,这个信号不再阻塞, 可重入
比如:同一个按钮连续按下10次,那么该按钮信号可能只响应5,6次,达不到10。设置该属性后,就可以达到10.达到阻塞后推迟响应的效果。
sigqueue(getpid(), SIGUSR1, sgv);
给某一进程发送信号,如例子中的给自己发出SIGUSR1信号,并传入额外的参数。
15信号sigaction的更多相关文章
- Linux 信号:signal 与 sigaction
0.Linux下查看支持的信号列表: france@Ubuntux64:~$ kill -l ) SIGHUP ) SIGINT ) SIGQUIT ) SIGILL ) SIGTRAP ) SIGA ...
- APUE学习笔记——10信号——信号接口函数 signal 和 sigaction
signal函数 signal函数是早起Unix系统的信号接口,早期系统中提供不可靠的信号机制.在后来的分支中,部分系统使用原来的不可靠机制定义signal函数,如 Solaris 10 .而 ...
- caffe之路-SIGTERM信号捕捉
Caffe在1.0版本仅支持两种信号的处理: 1) SIGHUP 2) SIGINT SIGHUP:caffe接收到此信号后进行snapshot,并不会中断caffe的训练. SIGINT:caffe ...
- Unix环境高级编程(十)信号续
1.signal函数 Unix系统的信号机制最简单的接口是signal函数,函数原型如下: #include <signal.h> typedef void (*sighandler_t) ...
- sigaction和sigqueue
sigaction函数相对于siganl函数控制信号的发送要更加精确一些,其函数原型为: int sigaction(int signum, const struct sigaction *act, ...
- 为shell布置陷阱:trap捕捉信号方法论
本文目录: 1.1 信号说明 1.2 trap布置陷阱 1.3 布置完美陷阱必备知识 家里有老鼠,快消灭它!哎,又给跑了.老鼠这小东西跑那么快,想直接直接消灭它还真不那么容易.于是,老鼠药.老鼠夹子或 ...
- Linux信号-信号集&信号屏蔽字&捕捉信号【转】
转自:https://blog.csdn.net/Lycorisradiata__/article/details/80096203 一. 阻塞信号 1. 信号的常见其他概念 实际执行信号的处理 ...
- linux下 signal信号机制的透彻分析与各种实例讲解
转自:http://blog.sina.com.cn/s/blog_636a55070101vs2d.html 转自:http://blog.csdn.net/tiany524/article/det ...
- linux信号-------初涉
一.信号的本质 软中断信号(signal,又简称为信号)用来通知进程发生了异步事件.在软件层次上是对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的.信号是进程 ...
随机推荐
- 使用 XPath
XPath 简介: (1) 前面我们爬取一个网页,都是使用正则表达式来提取想要的信息,但是这种方式比较复杂,一旦有一个地方写错,就匹配不出来了,因此我们可以使用 XPath 来进行提取(2) XPat ...
- 今天是学习C#面向过程的最后的一天
今天学习完啦面向过程,可能写法也就是那些,固定不变的,但是程序的写法就是由自己决定······ 今天学习了调用已经存在的方法,就是在.net Framework 中存在的方法,具体今天提到的有这些, ...
- 《C++ Primer Plus》第10章 对象和类 学习笔记
面向对象编程强调的是程序如何表示数据.使用 OOP 方法解决编程问题的第一步是根据它与程序之间的接口来描述数据,从而指定如何使用数据.然后,设计一个类来实现该接口.一般来说,私有数据成员存储信息,公有 ...
- $.post和jquerySubmit返回json数据获取的区别
$.post("/patrol/patrolDataContent!deleteContent.action",{"ids":ids},function(dat ...
- ruby+gem常用命令
gem是一种文件组织的包,一般的ruby的很多插件都有由这种各种的包提供.我们来看看gem的用法 ruby -v #查看ruby 版本 ruby -e ''require"watir ...
- LeetCode——Add and Search Word - Data structure design
Description: Design a data structure that supports the following two operations: void addWord(word) ...
- Android 判断是否是Rtl
第一种方法: private boolean isRtl() { return TextUtils.getLayoutDirectionFromLocale(Locale.getDefault()) ...
- 高中生的IT之路-1.5西餐厅服务生
之所以说漫长的求职,是因为培训结束后半年左右没有找到工作. 每次面试结束后,得到的都是“回去等消息”,然后就杳无音信了.一次次的面试,一次次的失败,一次次查找失败的原因.总结来看主要有两点:一是没有工 ...
- iOS tableview上放textfield
用UITableViewController就可以了,处理键盘弹出和消失的代码已经封装在UITableViewController里了.
- nginx如何利用自定义的conf文件启动?
1.进入nginx的安装目录; 2.nginx -s -c conf/my.conf (校验该文件是否有效) nginx -s -c conf/my.conf 命令会卡死,存疑 3.start ...