sigaction函数

(1)sigaction函数原型

sigaction函数用来查询和设置信号处理方式,它是用来替换早期的signal函数。sigaction函数原型及说明如下:

sigaction(查询和设置信号处理方式)

所需头文件

#include <signal.h>

函数说明

sigaction()会依参数signum指定的信号编号来设置该信号的处理函数

函数原型

int sigaction(int signum,const struct sigaction *act ,struct sigaction *oldact)

函数传入值

signum

可以指定SIGKILL和SIGSTOP以外的所有信号

act

参数结构sigaction定义如下

struct sigaction

{

void (*sa_handler) (int);

void  (*sa_sigaction)(int, siginfo_t *, void *);

sigset_t sa_mask;

int sa_flags;

void (*sa_restorer) (void);

}

①    sa_handler:此参数和signal()的参数handler相同,此参数主要用来对信号旧的安装函数signal()处理形式的支持

②    sa_sigaction:新的信号安装机制,处理函数被调用的时候,不但可以得到信号编号,而且可以获悉被调用的原因以及产生问题的上下文的相关信息。

③    sa_mask:用来设置在处理该信号时暂时将sa_mask指定的信号搁置

④    sa_restorer: 此参数没有使用

⑤    sa_flags:用来设置信号处理的其他相关操作,下列的数值可用。可用OR 运算(|)组合

Ÿ   A_NOCLDSTOP:如果参数signum为SIGCHLD,则当子进程暂停时并不会通知父进程

Ÿ   SA_ONESHOT/SA_RESETHAND:当调用新的信号处理函数前,将此信号处理方式改为系统预设的方式

Ÿ   SA_RESTART:被信号中断的系统调用会自行重启

Ÿ   SA_NOMASK/SA_NODEFER:在处理此信号未结束前不理会此信号的再次到来

Ÿ   SA_SIGINFO:信号处理函数是带有三个参数的sa_sigaction

oldact

如果参数oldact不是NULL指针,则原来的信号处理方式会由此结构sigaction返回

函数返回值

成功:0

出错:-1,错误原因存于error中

附加说明

信号处理安装的新旧两种机制:

①     使用旧的处理机制:struct sigaction act;  act.sa_handler=handler_old;

②     使用新的处理机制:struct sigaction act; act.sa_sigaction=handler_new;

并设置sa_flags的SA_SIGINFO位

错误代码

EINVAL:参数signum不合法,或是企图拦截SIGKILL/SIGSTOP信号

EFAULT:参数act,oldact指针地址无法存取

EINTR:此调用被中断

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/types.h>
#include <unistd.h>
void new_op(int, siginfo_t *, void *);

int main(int argc, char** argv)
{
    struct sigaction act;
    int sig;
    sig = atoi(argv[1]);
    sigemptyset(&act.sa_mask);
    act.sa_flags=SA_SIGINFO;
    act.sa_sigaction=new_op;
    if (sigaction(sig, &act, NULL)<0)
    {   
        perror("install sigal error");
        return -1; 
    }   
    while(1)
    {   
        sleep(2);
        printf("wait for the signal\n");
    }   
    return 0;
}
void new_op(int signum, siginfo_t *info, void *myact)
{
    printf("receive signam %d\n", signum);
    sleep(5);
}

gcc sigaction_t1.c -o sigaction_t1 -g

#./sigaction_t1 1
wait for the signal

wait for the signal

#./sigaction_t1 2
wait for the signal
wait for the signal
wait for the signal
receive signam 2

#

sigaction函数使用实例相关推荐

  1. 信号的用法,signal函数、sigaction函数及信号集(sigemptyset,sigaddset)操作函数

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

  2. Linux信号详解:signal与sigaction函数【2】

    我们已经讨论了Linux操作系统中"信号"."中断"."僵尸进程"'等重要概念.结合C语言中的setjmp.longjump.sigsetj ...

  3. linux中signal函数返回值,signal函数、sigaction函数及信号集操作函数

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

  4. python输入字符串转换为公式_将python字符串转化成长表达式的函数eval实例

    爬一个网页时,要保存的数据都没有encode,就导致保存下来的中文都变成unicode了... 那么,怎么把一个表示字符串的unicode还原成unicode呢? 函数eval(expression) ...

  5. python命名空间和闭包_Python函数基础实例详解【函数嵌套,命名空间,函数对象,闭包函数等】...

    本文实例讲述了Python函数基础用法.分享给大家供大家参考,具体如下: 一.什么是命名关键字参数? 格式: 在*后面参数都是命名关键字参数. 特点: 1.约束函数的调用者必须按照Kye=value的 ...

  6. 【Android 逆向】函数拦截实例 ( ③ 刷新 CPU 高速缓存 | ④ 处理拦截函数 | ⑤ 返回特定结果 )

    文章目录 前言 一.刷新 CPU 高速缓存 二.处理拦截函数 1.桩函数 2.处理拦截函数 三.返回特定结果 四.相关完整代码 前言 [Android 逆向]函数拦截实例 ( 函数拦截流程 | ① 定 ...

  7. 【Android 逆向】函数拦截实例 ( ② 插桩操作 | 保存实际函数入口 6 字节数据 | 在插桩的函数入口写入跳转指令 | 构造拼接桩函数 )

    文章目录 前言 一.函数拦截需要的几个参数 二.插桩前先保存实际函数入口 6 字节数据 三.在插桩的函数入口写入跳转指令 | 构造拼接桩函数 前言 [Android 逆向]函数拦截实例 ( 函数拦截流 ...

  8. sigaction 函数,sigemptyset()函数,fcntl()函数,isatty()函数

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

  9. sigaction函数解析

    sigaction函数的功能是检查或修改与指定信号相关联的处理动作(可同时两种操作). 他是POSIX的信号接口,而signal()是标准C的信号接口(如果程序必须在非POSIX系统上运行,那么就应该 ...

最新文章

  1. 53位作者只有1个华人?NeurIPS 2021大奖揭晓,Google、DeepMind、斯坦福百花齐放
  2. iOS5.1 + XCode4.5 device debug,the screen will ...
  3. Java数据结构——2-3树
  4. php学生分班,学生分班工具下载
  5. CCF NOI1020 数字识别
  6. 了解PS、学习使用html语义化标签和CSS术语
  7. ASP读取文件 ASP写入/保存文件
  8. Python 3的反驳
  9. [数学 FFT] Codechef July Challenge 2017 #APRPS Irrational Root
  10. 韩信点兵问题(中国剩余定理)
  11. 计算机高级筛选操作步骤,【EXCLE表格中根据特定的条件进行高级筛选】计算机excel高级筛选步骤...
  12. 洛阳理工学院计算机类分数线,2017洛阳理工学院录取分数线
  13. 解决The conversion of a datetime2 data type to a datetime data type resulted in an out-of-range value
  14. matlab差分阶跃响应,matlab在DSP中的应用(四)---离散系统的冲激响应和阶跃响应...
  15. 《Google Chrome:谷歌浏览器》 --不作恶,但可以恶心你
  16. matlab计算潮差程序,t_tide潮汐潮流调和分析工具包教程
  17. 偏度与峰度(附python代码)
  18. 计算机视觉中的Transformer
  19. js如何保留两位小数
  20. 青少年等级考试【Python通关干货】(一级)

热门文章

  1. xcode开发php,xcode怎么编写c语言
  2. mysql grant教程_MySQL如何使用授权命令grant
  3. java 日期函数转换_java 日期函数转换
  4. stm32for循环几个机械周期_波浪理论之五:循环周期理论
  5. java缺_java – 缺少主类
  6. Flask中session和cookies的设置、删除、修改、获取
  7. (9) hibernate加载持久化对象的两种方式——get、load
  8. java面试题十一 基本数据类型
  9. 2019年末逆向复习系列之今日头条WEB端_signature、as、cp参数逆向分析
  10. Python3--unitest框架的使用