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. c#和Java中的继承

    c#和Java: 1.首先,子类继承了父类的属性和方法,但是子类并没有继承父类的私有字段. 2.子类并没有继承父类的构造函数,但是.子类会默认的调用父类无参数的构造函数,创建父类对象,让子类可以使用父 ...

  2. untiy3d action管理机制的编写

    使用unity3d对于一些可视化强迫者来说,是一个不错的选择,但unity3d没有cocos2d的action管理机制,比如cocos2dx的CCMoveTo,CCScale等action,所以笔者通 ...

  3. Codeforces 517 #A

    http://codeforces.com/contest/1072/problem/A 题目挺简单,就是让你求几个环,占得方格的个数,然而题目为什么给出了公式呢? 然而给出的公式辣么丑,还是不用的好 ...

  4. yagmail 邮箱的使用

    文章来源:GITHub:https://github.com/kootenpv/yagmail 安装 pip3 install yagmail pip3 install keyring 简单例子 im ...

  5. 使用selenium和phantomJS浏览器登陆豆瓣的小演示

    # 使用selenium和phantomJS浏览器登陆豆瓣的小演示 # 导入库 from selenium import webdriver # 实例化一个浏览器对象 web = webdriver. ...

  6. 这一千个Python库,总有你想要的!

    环境管理 管理 Python 版本和环境的工具 p – 非常简单的交互式 python 版本管理工具. pyenv – 简单的 Python 版本管理工具. Vex – 可以在虚拟环境中执行命令. v ...

  7. IOC容器和Bean的配置

     IOC容器和Bean的配置   1        IOC和DI ①IOC(Inversion of Control):反转控制. 在应用程序中的组件需要获取资源时,传统的方式是组件主动的从容器中获取 ...

  8. bash函数定义/使用/传参…

    函数:function, 功能     过程式编程,代码重用         模块化编程         简洁             语法:         function f_name {    ...

  9. 【转载】美国人教你这样用Google

    大前提:英文Google→www.google.com 第一篇 在搜索框上输入:“indexof/”inurl:lib 再按搜索你将进入许多图书馆,并且一定能下载自己喜欢的书籍. 在搜索框上输入:“i ...

  10. UVa 11795 状压DP Mega Man's Mission

    kill[S]表示消灭机器人的集合为S,剩下的所能杀死的机器人集合. 设d(S)表示杀死机器人集合为S的方法数,答案为d((1<<n) - 1). d(S)可以由d(S')转移过来,其中S ...