sigaction函数的功能是检查或修改指定信号相关联的处理动作,此函数取代UNIX早期版本使用的signal函数。

#include<signal.h>
int sigaction(int signo, const struct sigaction *restrict act, struct sigaction *restrict oact);
//若成功则返回0,出错则返回-1.

参数signo是要检测或修改其具体动作的信号编号。

若act指针非空,则要修改其动作;如果oact指针非空,则系统经由oact指针返回该信号的上一个动作,此函数使用如下结构:

struct sigction{
void (*sa_handler)(int); //信号捕捉函数的地址或者SIG_IGN,或者SIG_DFL
sigset_t sa_mask; //在调用信号捕捉函数之前要屏蔽的信号,当从信号步骤函数返回时,将进程信号屏蔽字复原。
//操作系统建立的新信号屏蔽字包含正在被递送的信号。
int sa_flags; //信号选项
void (*sa_sigaction)(int, siginfo_t*, void*); //替代信号处理函数地址
}

act结构的sa_flags字段指定对信号处理的各个选项。

sa_sigaction字段是一个替代的信号处理程序,当在sigaction结构中使用了SA_SIGINFO标志时,使用该信号处理程序。

通常,按下列方式调用信号处理程序:

void handler(int signo);

但是,如果设置了SA_SIGINFO标志,那么按照下列方式调用信号处理程序:

void handler(int signo, siginfo_t *info, void *context);

siginfo_t结构包含了信号产生原因的有关信息,该结构的大致样式如下:

struct siginfo{
int sig_signo; //信号
int sig_errno; //如果不是0,就是errno.h中的errno值
int sig_code; //附加信息(取决于信号)
pid_t si_pid; //发送信号的进程ID
uid_t sig_uid; //发送信号的进程真实用户ID
void *si_addr; //产生错误的地址
int si_status; //退出值或者信号值
long si_band; //SIGPOLL的band号
//可能还会有其他的值。
}

实践:

#include <stdio.h>
#include <signal.h> static void sighandle(int signo){
printf("catch signo:%d\n",signo);
} int main(void){
struct sigaction act;
act.sa_handler = sighandle;
sigemptyset(&act.sa_mask);
act.sa_flags = 0;
if(sigaction(SIGQUIT,&act,NULL) <0){
perror("sigaction");
return -1;
}
while(1){
pause();
}
return 0;
}

运行结果:

yan@yan-vm:~/apue$ ./a.out
^\catch signo:3
^\catch signo:3
^\catch signo:3
^\catch signo:3
^C

《UNIX环境高级编程》笔记--sigaction函数的更多相关文章

  1. UNIX环境高级编程笔记之文件I/O

    一.总结 在写之前,先唠几句,<UNIX环境高级编程>,简称APUE,这本书简直是本神书,像我这种小白,基本上每看完一章都是“哇”这种很吃惊的表情.其实大概三年前,那会大三,我就买了这本书 ...

  2. UNIX环境高级编程笔记 目录

    每一章的重点会使用加粗字体 第一章:UNIX基础知识:UNIX体系结构:文件和目录:输入和输出:程序和进程:出错处理:信号:时间值:系统调用和库函数 第三章:文件I/O:文件描述符:文件操作函数:文件 ...

  3. Unix环境高级编程(七)fork函数总结

    在Unix/Linux中用fork函数创建一个新的进程.进程是由当前已有进程调用fork函数创建,分叉的进程叫子进程,创建者叫父进程.该函数的特点是调用一次,返回两次,一次是在父进程,一次是在子进程. ...

  4. UNIX环境高级编程笔记之高级I/O

    本章说明了很多高级I/O功能: 非阻塞I/O——发一个I/O操作,不使其阻塞,记录锁,STREAMS机制 I/O多路转接——select和poll函数 readv和writev函数,以及存储映射I/O ...

  5. UNIX环境高级编程笔记之进程控制

    本章重点介绍了进程控制的几个函数:fork.exec族._exit.wait和waitpid等,主要需要掌握的是父进程和子进程之间的运行机制,怎么处理进程的正常和异常终止.以及怎么让进程执行不同的程序 ...

  6. UNIX环境高级编程笔记之标准I/O库

    一.总结 文件I/O一章讲了不带缓冲的I/O,本章讲的是带缓冲的I/O.不带缓冲针对的是内核的系统调用,而带缓冲针对的是用户空间的标准库函数,是基于带缓冲的I/O实现的.不带缓冲的I/O通过文件描述符 ...

  7. UNIX环境高级编程笔记之线程

    本章涉及到线程的一些基本知识点,讨论了现有的创建线程和销毁线程的POSIX.1原语,此外,重点介绍了线程同步问题,讨论了三种基本的同步机制:互斥量.读写锁.条件变量.

  8. UNIX环境高级编程笔记之进程环境

    本章讲的都是一些非常基础的知识,目的是为了下一章讲进程控制做铺垫,所以,本章就不做过多的总结了,直接看图吧.

  9. UNIX环境高级编程——sigqueue、sigsuspend函数

    一.sigqueue函数 功能:新的发送信号系统调用,主要是针对实时信号提出的支持信号带有参数,与函数sigaction()配合使用. int sigqueue(pid_t pid, int sig, ...

  10. 《unix环境高级编程》学习笔记【原创】

    本文基于unix环境高级编程的学习的笔记,写的比较简如有不对,欢迎指点. 简单的描述下面函数的功能改变ctr+c信号原本的作用终止程序,在按下中断键的时候输出一句话. while循环主要读取用户的输入 ...

随机推荐

  1. 初遇Git与MarkDown 文件

    新年好! 昨晚熬夜在学Git,稍微会了一些命令. 推荐大家去try.github.io上学习,这是GitHub提供的网页,它在网页提供了一个“伪”模拟器,根据网页的提示学习命令.网页上说15分钟就能学 ...

  2. java学习之实现文件的复制

    package com.io; import java.io.*; import java.text.SimpleDateFormat; import java.util.Date; /** * 文件 ...

  3. 怎么在Ubuntu Scope中获取location地址信息

    Location信息对非常多有地址进行搜索的应用来说非常重要.比方对dianping这种应用来说.我们能够通过地址来获取当前位置的一些信息.在这篇文章中,我们来介绍怎样获取Scope架构中的位置信息. ...

  4. Python基础 3----文件和网络

    1 Python文件IO 1 标转的输入和输出 print 方法:输出数据到标准的输出 raw_input 方法:标准的输入 2 file文件类 读文件 f = file(文件名, 模式) 有5种模式 ...

  5. Python重写C语言程序100例--Part9

    ''' [程序71] 题目:编写input()和output()函数输入,输出5个学生的数据记录. 1.程序分析: 2.程序源码: 使用list来模拟结构(不使用class) stu = [strin ...

  6. 二分法查找的C语言实现:

    #include <stdio.h> int binSearch(int, int, int); main() { int i, n = 10, x = 7; //这里假设把数组a[]定义 ...

  7. nginx前端负载,后端apache获取真实IP设置

    原文链接: nginx前端负载,后端apache获取真实IP设置 参考文献: 前端Nginx,后端Apache获取用户真实IP地址  按照第二种方法设置不成功! 网站最前端是nginx,做的PROXY ...

  8. php上传文件,创建递归目录

    <?php $uid=$_REQUEST['uid']; $avatar = 'D:/avic/discuz/uc_server/data/avatar/'.get_avatar($uid, $ ...

  9. DDL\DML\DCL\DQL

    [DML] DML = Data Manipulation Language,数据操纵语言,命令使用户能够查询数据库以及操作已有数据库中的数据的计算机语言.具体是指是UPDATE更新.INSERT插入 ...

  10. 一个RPC的demo

    从下面的例子中可以看到,Consumer(client)的代码中引用了Provider部分的class,本例中是 com.provider.EchoServiceImpl和com.provider.E ...