信号处理

信号值小于 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的更多相关文章

  1. Linux 信号:signal 与 sigaction

    0.Linux下查看支持的信号列表: france@Ubuntux64:~$ kill -l ) SIGHUP ) SIGINT ) SIGQUIT ) SIGILL ) SIGTRAP ) SIGA ...

  2. APUE学习笔记——10信号——信号接口函数 signal 和 sigaction

    signal函数     signal函数是早起Unix系统的信号接口,早期系统中提供不可靠的信号机制.在后来的分支中,部分系统使用原来的不可靠机制定义signal函数,如 Solaris 10 .而 ...

  3. caffe之路-SIGTERM信号捕捉

    Caffe在1.0版本仅支持两种信号的处理: 1) SIGHUP 2) SIGINT SIGHUP:caffe接收到此信号后进行snapshot,并不会中断caffe的训练. SIGINT:caffe ...

  4. Unix环境高级编程(十)信号续

    1.signal函数 Unix系统的信号机制最简单的接口是signal函数,函数原型如下: #include <signal.h> typedef void (*sighandler_t) ...

  5. sigaction和sigqueue

    sigaction函数相对于siganl函数控制信号的发送要更加精确一些,其函数原型为: int sigaction(int signum, const struct sigaction *act, ...

  6. 为shell布置陷阱:trap捕捉信号方法论

    本文目录: 1.1 信号说明 1.2 trap布置陷阱 1.3 布置完美陷阱必备知识 家里有老鼠,快消灭它!哎,又给跑了.老鼠这小东西跑那么快,想直接直接消灭它还真不那么容易.于是,老鼠药.老鼠夹子或 ...

  7. Linux信号-信号集&信号屏蔽字&捕捉信号【转】

    转自:https://blog.csdn.net/Lycorisradiata__/article/details/80096203 一. 阻塞信号 1. 信号的常见其他概念    实际执行信号的处理 ...

  8. linux下 signal信号机制的透彻分析与各种实例讲解

    转自:http://blog.sina.com.cn/s/blog_636a55070101vs2d.html 转自:http://blog.csdn.net/tiany524/article/det ...

  9. linux信号-------初涉

    一.信号的本质 软中断信号(signal,又简称为信号)用来通知进程发生了异步事件.在软件层次上是对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的.信号是进程 ...

随机推荐

  1. ios开发之--iOS 11适配:iOS11导航栏返回偏移

    UIBarButtonItem 左边间隙过大,解决方案(ios11之前): 调用下面的方法,设置negativeSpacer.width = -15;就可以解决间隙过大的问题: UIBarButton ...

  2. python2.0_s12_day12_css样式详解

    CSScss是英文Cascading Style Sheets的缩写,称为层叠样式表,用于对页面进行美化. CSS 存放方式有三种: 一种写法:在<body></body>内部 ...

  3. 查看系统资源使用情况:vmstat

    vmstat命令可以动态地查看系统资源的使用情况,如内存/交换分区/CPU的使用情况,通过使用该命令可以判断系统的瓶颈在哪里: [root@localhost ~]$ vmstat 1 5 # 表示每 ...

  4. Triton调试记录

    先编译Release版本 先从下拉列表选择Release-MT-DLL,然后选中Triton-vc14工程, 修改项目属性配置为Release-MT-DLL-NODX,NODX的意思是不使用Direc ...

  5. Android编译系统(Android.mk文件详解)

    [Android-NDK(Native Development Kit)  docs文档] NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成a ...

  6. poj_3261 后缀数组

    题目大意 给出一个数字串,找出其中至少重复K次的最长的子串长度. 题目分析 直接用后缀数组来求解,限制height[i]的长度来对排好序的后缀进行分组(这种方法经常在字符串问题中被使用).     先 ...

  7. 收集的可以下载css3字体图标的网站

    http://icomoon.io/app/ 可以选择跟简单调整图标打包成css3 字体下载, http://www.flaticon.com/categories/weapons

  8. PHP 允许Ajax跨域访问 (Access-Control-Allow-Origin)

    Ajax访问php,报错 php顶部加上即可: header("Access-Control-Allow-Origin: *");

  9. ehcache加载配置文件ehcache.xml的源码

    package net.sf.ehcache.config; public final class ConfigurationFactory { public static Configuration ...

  10. Python - 字符串的方法及注释

    %r非常有用,他的含义是不管是整形还是字符串,都将打印出来