1.信号是软件中断,提供一种异步处理事件的方法

很多事件产生信号:
(1)用户按下某些中断键,如 Ctrl + C键产生 SIGINT信号
(2)硬件异常产生信号,比如 除数为0,无效的内存引用 
(3)进程调用kill函数可将信号发送给另一个进程
 
处理信号的三种方式:
(1)忽略此信号。大多数信号都采用这种方式处理,但是 SIGKILL和SIGSTOP决不能忽略
(2)捕捉信号。发生某种信号时,调用一个信号处理函数。SIGKILL和SIGSTOP信号不能被捕捉
(3)执行系统默认动作。大多数是终止进程
 
SIGCHLD:进程终止时向其父进程发送的信号,默认为忽略。父进程也可以捕捉该信号。
SIGFPE:  算术运算异常,如除数为0
SIGINT:  用户按下中断键,一般为 Ctrl + C
SIGSEGV:无效的内存引用
 

2.中断的系统调用

如果进程在执行一个低速系统调用而阻塞期间捕捉到一个信号,则该系统调用就中断不再执行
低速系统调用:读写某些类型文件(管道、终端、网络套接字)
 
again:
if ((n = read(fd, buf, BUFSIZE)) < ) {
if (errno == EINTR)
goto again; /* just an interrupted system call */
/* handle other errors */
}

3.使用longjmp,带超时限制调用read

  #include <stdio.h>
#include <setjmp.h>
#include <unistd.h>
#include <signal.h> static jmp_buf env_alarm;
static void sig_alarm(int signo)
{
longjmp(env_alarm, );
} int main(int argc, char* argv[])
{
char buf[];
if (signal(SIGALRM, sig_alarm) == SIG_ERR) {
fprintf(stderr, "signal(SIGALRM) error\n");
} if (setjmp(env_alarm) != ) {
fprintf(stderr, "read timeout\n");
return -;
}
alarm();
int nread = ;
if ((nread = read(STDIN_FILENO, buf, )) < ) {
fprintf(stderr, "read error\n");
}
alarm();
write(STDOUT_FILENO, buf, nread);
return ;
}

4.sigaction函数

sigaction函数用来检查或修改与指定信号相关联的处理动作
struct sigaction {
void (*sa_handler)(int); /* addr of signal handler */
sigset_t sa_mask; /* addtional signals to block */
int sa_flags; /* signal options */
void (*sa_sigaction)(int, siginfo_t *, void *); /* alternate handler */
};

posix使用sigaction实现signal(原有的signal函数语义不可靠)

typedef void Sigfunc(int);

Sigfunc* signal(int signo, Sigfunc* func)
{
struct sigaction newact, oldact;
newact.sa_handler = func;
sigemptyset(&newact.sa_mask);
newact.sa_flags = ;
if (signo == SIGALRM) {
#ifdef SA_INTERRUPT
newact.sa_flags |= SA_INTERRUPT;
#endif
} else {
#ifdef SA_RESTART
newact.sa_flags |= SA_RESTART;
#endif
}
if (sigaction(signo, &newact, &oldact) < ) {
return (SIG_ERR);
}
return oldact.sa_handler;
}

APUE 学习笔记(七) 信号的更多相关文章

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

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

  2. APUE学习笔记——10 信号

    信号的基本概念     信号是软件中断,信号提供了解决异步时间的方法.     每一中信号都有一个名字,信号名以SIG开头. 产生信号的几种方式     很多条件可以产生信号:     终端交互:用户 ...

  3. APUE学习笔记5——信号、信号集和进程信号屏蔽字

    1 信号传递过程 当引发信号的事件发生时(如软硬件异常.软件定时.终端产生信号或调用kill函数等等),会产生信号,内核会发送给目标进程. 在信号产生到信号传递给目标进程之间的时间间隔内,称该信号为未 ...

  4. APUE学习笔记——10.9 信号发送函数kill、 raise、alarm、pause

    转载注明出处:Windeal学习笔记 kil和raise kill()用来向进程或进程组发送信号 raise()用来向自身进程发送信号. #include <signal.h> int k ...

  5. (转)Qt Model/View 学习笔记 (七)——Delegate类

    Qt Model/View 学习笔记 (七) Delegate  类 概念 与MVC模式不同,model/view结构没有用于与用户交互的完全独立的组件.一般来讲, view负责把数据展示 给用户,也 ...

  6. Learning ROS for Robotics Programming Second Edition学习笔记(七) indigo PCL xtion pro live

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS forRobotics Pro ...

  7. Typescript 学习笔记七:泛型

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  8. python3.4学习笔记(七) 学习网站博客推荐

    python3.4学习笔记(七) 学习网站博客推荐 深入 Python 3http://sebug.net/paper/books/dive-into-python3/<深入 Python 3& ...

  9. Go语言学习笔记七: 函数

    Go语言学习笔记七: 函数 Go语言有函数还有方法,神奇不.这有点像python了. 函数定义 func function_name( [parameter list] ) [return_types ...

随机推荐

  1. angular设置反向代理

    本地调试,需要用到服务器的api,发现chrome安全问题,需要解决跨域问题.现给出解决方案: 1.增加proxy.conf.json文件 位置与package.json文件同级(可指定) 2.pac ...

  2. SC || Chapter7 健壮性和正确性

    finally中语句不论有无异常都执行 若子类重写了父类方法,父类方法没有抛出异常,子类应自己处理全部异常而不再传播:子类从父类继承的方法不能增加或更改异常 判断checked和unchecked: ...

  3. WPF DataGridCheckBoxColumn需要点两次才能修改checkbox状态

    如题,如果必须要用DataGridCheckBoxColumn使用一下方式就可以解决需要点击两次才能改状态的问题 <DataGridCheckBoxColumn> <DataGrid ...

  4. 数组char a[4] 保存了一个数据,怎么转换为unsigned int呢 ?

    [待解决问题] 浏览: 701次 注意char并不表示字符的 a[0]=0; a[1]=0; a[2]=3; a[3]=0; 那么我要的unsigned int b应该等于: b= 0x0000030 ...

  5. Linux 命令、配置文件及操作

    Linux 命令.配置文件及操作 命令 命令 参数 说明 A alias.unalias 命令别名 B C cat 查看文件内容 cd 切换目录 chown 修改拥有着 chgrp 修改所属组 chm ...

  6. 地理位置编码geohash学习笔记

    1.geohash及其性质 一种空间索引技术. (1)将二维的经纬度位置数据转换为一维的字符串(基本上hash族的算法都是这样): 其优点在于hash编码后的字符串,可以方便查找和索引,从而减少相似计 ...

  7. MySQL_8.0.15_Windows10_X64 安装教程

    最近学习的内容涉及到MySQL的知识,所以安装一个MySQL非常有必要,参考别人的教程安装过程还算顺利,其中遇到了一些问题查了一些也解决了,这里把整个安装过程梳理一遍,给大家一个参考. 我手里的电脑是 ...

  8. Python基础-面向对象初识--类

    什么是类 具有相似功能和属性的一类实物 什么是对象 类的具体体现,具体到一个 面向对象的优势 1.类是一组相似功能的集合,使组织结构更加清晰和规范化 2.研究面向对象要有上帝的思维,用面向对象设计程序 ...

  9. CentOS 7.0 使用 yum 安装 MariaDB 及 简单配置

    1.安装MariaDB 安装命令 yum -y install MariaDB-server MariaDB-client 安装完成MariaDB,首先启动MariaDB 设置开机启动 接下来进行Ma ...

  10. Linux任务计划、周期性任务执行

    Linux任务计划.周期性任务执行 周期性任务执行: cron 守护进程(crond):服务,不间断地运行于后台 # service crond {start|stop|status|restart} ...