ilocker:关注 Android 安全(新入行,0基础) QQ: 2597294287

 #include <signal.h>
int sigaction(int signo, const struct sigaction* act, struct sigaction* oact);

sigaction 用来设置或修改指定信号的 action (处理动作)。若参数 oact 非空,则系统会通过其返回 old action。

struct sigaction 在 android(-arm) 下的定义:

 struct sigaction {
union {
//addr of signal handler or SIG_IGN, or SIG_DFL
void (*_sa_handler)(int signo);
//alternate(替代的) handler
void (*_sa_sigaction)(int signo, struct siginfo *info, void *context);
} _u;
sigset_t sa_mask; //additional signals to block
unsigned long sa_flags; //signal options
void (*sa_restorer)(void);
};

参数 sa_mask 指定一个信号集,当信号处理程序被调用时,系统会阻塞这些信号。并且当前信号(参数 signo 指定)会被自动加入到这个信号集,这样保证了在处理指定的信号时,如果该信号再次发生,它会被阻塞,直到前一个信号处理结束。

参数 sa_flags 可以指定一些选项,如:SA_SIGINFO、SA_ONSTACK、SA_RESTART、SA_RESTORER。

如果设置了 SA_SIGINFO,则表示使用 _sa_sigaction信号处理程序 (默认是_sa_handler),通过参数 info 能够得到一些产生信号的信息。比如struct siginfo中有一个成员 si_code,当信号是 SIGBUS 时,如果 si_code 为 BUS_ADRALN,则表示“无效的地址对齐”。

SA_RESTORER 与 sa_restorer 配对使用,貌似也是为了返回旧的信号处理程序,但现在应该是已经弃用了。

SA_ONSTACK 表示使用一个替代栈。具体有什么作用,可以参考 stackoverflow 上的一个帖子

ASK:When the signal is delivered, the signal handler is executed on the stack of the process. If SA_ONSTACK is used in sigaction(), then a different stack is used.

What is the use of using different stack? Any use case example?

ANSWER:One use of an alternate stack is to try and handle SIGSEGV properly.

If your process just received a SIGSEGV because it exceeded its stack limit, you can't run the signal handler on the process's stack - it's full already. Having an alternate stack allows you to (carefully) run some more or less graceful shutdown in that case.

SA_RESTART:使被信号中断的系统调用能够重新发起。

实际上前面学习的 signal 函数,通常内部也是调用 sigaction 来实现的,android 系统也是这样:

 sighandler_t _signal(int signum, sighandler_t handler, int flags) {
struct sigaction sa;
sigemptyset(&sa.sa_mask);
sa.sa_handler = handler;
sa.sa_flags = flags; if (sigaction(signum, &sa, &sa) == -) {
return SIG_ERR;
}
return (sighandler_t) sa.sa_handler;
} sighandler_t signal(int signum, sighandler_t handler) {
return _signal(signum, handler, SA_RESTART);
}

最后,sigaction 函数的一个使用示例:

 void set_signal_handler() {
struct sigaction action;
memset(&action, , sizeof(action)); sigemptyset(&action.sa_mask);
action.sa_sigaction = debuggerd_signal_handler;
action.sa_flags = SA_RESTART | SA_SIGINFO; //Use the alternate signal stack if available so we can catch stack overflows.
action.sa_flags |= SA_ONSTACK;
sigaction(SIGSEGV, &action, NULL);
}

学习资料: 《unix环境高级编程》

Linux 信号(三)—— sigaction 函数的更多相关文章

  1. Linux C--信号 sigaction函数

    使用 sigaction 函数: signal 函数的使用方法简单,但并不属于 POSIX 标准,在各类 UNIX 平台上的实现不尽相同,因此其用途受 到了一定的限制.而 POSIX 标准定义的信号处 ...

  2. 信号之sigaction函数

    sigaction函数的功能是检查或修改与指定信号相关联的处理动作(或同时执行这两种操作). #include <signal.h> int sigaction( int signo, c ...

  3. Linux 信号signal处理函数

    转自:http://www.cnblogs.com/taobataoma/archive/2007/08/30/875662.html alarm(设置信号传送闹钟) 相关函数 signal,slee ...

  4. Linux 信号signal处理函数--转

    alarm(设置信号传送闹钟)相关函数 signal,sleep 表头文件 #include<unistd.h> 定义函数 unsigned int alarm(unsigned int ...

  5. signal函数、sigaction函数及信号集(sigemptyset,sigaddset)操作函数

    信号是与一定的进程相联系的.也就是说,一个进程可以决定在进程中对哪些信号进行什 么样的处理.例如,一个进程可以忽略某些信号而只处理其他一些信号:另外,一个进程还可以选择如何处理信号.总之,这些总与特定 ...

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

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

  7. 信号的捕捉与sigaction函数

    一.内核如何实现信号的捕捉 如果信号的处理动作是用户自定义函数,在信号递达时就调用这个函数,这称为捕捉信号.由于信号处理函数的代码是在用户空间的,处理过程比较复杂,举例如下: 1. 用户程序注册了SI ...

  8. Linux信号、信号处理和信号处理函数

    信号(signal)是一种软件中断,它提供了一种处理异步事件的方法,也是进程间惟一的异步通信方式.在Linux系统中,根据POSIX标准扩展以后的信号机制,不仅可以用来通知某种程序发生了什么事件,还可 ...

  9. Linux 信号:signal 与 sigaction

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

随机推荐

  1. C# EPL USB 指令打印

    private void btnPrinter_Click(object sender, EventArgs e) { #region ESC 热敏图像点阵像素点读取打印 //Bitmap bitma ...

  2. Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://localhost:9001/api/size/get. (Reason: CORS header 'Access-Control-Allow-Origin' missing).

    Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http:/ ...

  3. 从零开始编写属于我的CMS:(六)插件

    二三四五还没写,先写六吧(有道友说想看看插件部分). 这里是一 从零开始编写属于我的CMS:(一)前言 一,首先预定义接口 新建类库,WangCms.PluginInterface 新建两个类,一个实 ...

  4. .NET跨平台之Sake和KoreBuild

    最近在了解Asp.net Core 1.0(也可称为Asp.net5\Asp.net vNext)的跨平台,发现了两个新的新东西:Sake和KoreBuild(或者已经出了很久). 通过国内某度查询资 ...

  5. web api中的RouteHandler

    ASP.NET MVC4中引入的Web API可以说是进行REST软件开发的利器(个人意见),但是最近在web form中混入web api时,发现一个问题:由于以前的web form项目中,使用到了 ...

  6. WPF平台Grid控件性能比较

    WPF官方发布第一个版本至今已经有10年了, 我们几乎在同时也开始了XAML开发.即使经过多年打造,我们依旧尝试提高:我们真的成功打造了高效灵活的控件吗?我没有在其他地方找到任何关于优秀的WPF表格性 ...

  7. Java Web项目RSA加密

    最近做的一个项目,服务器为Java,采用SSH框架,客户端为Android和IOS.当用户登录时,从客户端向服务器提交用户名和密码.这就存在一个问题,如果数据包在网络上被其他人截取了,密码就有可能泄露 ...

  8. 从零开始学Python06作业源码(仅供参考)

    Python Version 2.7x 一,bin目录:程序启动入口 SelectLesson_start.py #!usr/bin/env python # -*- coding:utf-8 -*- ...

  9. php基础知识

    PHP 是一种创建动态交互性站点的强有力的服务器端脚本语言[脚本在服务器上执行]. PHP 文件能够包含文本.HTML.CSS 以及 PHP 代码,在服务器上的执行结果以纯文本返回浏览器. php可以 ...

  10. GJM :多人在线游戏的设计思路

    感谢您的阅读.喜欢的.有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力以及转载收藏动力.欢迎转载! 版权声明:本文原创发表于 [请点击连接前往] ,未经 ...