linux通信之信号
一. 信号介绍
1.1. 什么是信号
1.1.1. 信号是内容受限的一种异步通信机制
a. 之所以称之为受限是因为通信内容在OS已经规定,内容简单,单一(signal.h文件中定义好)
b. 信号本质上是int型数字编号(事先定义好的)
1.2. 信号处理
1.2.1. 忽略信号
a. 忽略信号就是不做任何处理,保护默认处理也会忽略(但9号信号是不能被忽略的)
1.2.2. 捕获信号
a. 信号绑定了一个函数,设置捕获函数后就会忽略默认处理,但9号信号是不能被忽略的
1.2.3. 默认处理
a. 当前进程没有明显的管这个信号,默认:忽略或终止进程,比如SIGINT默认终止前台进程
1.3. 信号类型
#define SIGHUP 1
#define SIGINT 2
#define SIGQUIT 3
#define SIGILL 4
#define SIGTRAP 5
#define SIGABRT 6
#define SIGIOT 6
#define SIGBUS 7
#define SIGFPE 8
#define SIGKILL 9
#define SIGUSR1 10
#define SIGSEGV 11
#define SIGUSR2 12
#define SIGPIPE 13
#define SIGALRM 14
#define SIGTERM 15
#define SIGSTKFLT 16
#define SIGCHLD 17
#define SIGCONT 18
#define SIGSTOP 19
#define SIGTSTP 20
#define SIGTTIN 21
#define SIGTTOU 22
#define SIGURG 23
#define SIGXCPU 24
#define SIGXFSZ 25
#define SIGVTALRM 26
#define SIGPROF 27
#define SIGWINCH 28
#define SIGIO 29
#define SIGPOLL SIGIO
/*
#define SIGLOST 29
*/
#define SIGPWR 30
#define SIGSYS 31
#define SIGUNUSED 31
1.3.1. 上述是OS所支持的所有信号
1.3.2. 常见信号介绍
(1)SIGINT 2 Ctrl+C时OS送给前台进程组中每个进程
(2)SIGABRT 6 调用abort函数,进程异常终止
(3)SIGPOLL SIGIO 8 指示一个异步IO事件,在高级IO中提及
(4)SIGKILL 9 杀死进程的终极办法
(5)SIGSEGV 11 无效存储访问时OS发出该信号(出现段错误时就通过此信号)
(6)SIGPIPE 13 涉及管道和socket
(7)SIGALARM 14 涉及alarm函数的实现
(8)SIGTERM 15 kill命令发送的OS默认终止信号
(9)SIGCHLD 17 子进程终止或停止时OS向其父进程发此信号(回收数据)
(10)SIGUSR1 10 和SIGUSR2 12 用户自定义信号,作用和意义由应用自己定义
二. 相关API
2.1. signal函数介绍
a. signal函数绑定一个捕获函数后信号发生后会自动执行绑定的捕获函数,并且把信号编号作为传参传给捕获函数
b. signal的返回值在出错时为SIG_ERR,绑定成功时返回旧的捕获函数
#include <signal.h>
#include "tlpi_hdr.h" static void sigHandler(int sig)
{
static int count = ;
/* UNSAFE: This handler uses non-async-signal-safe functions (printf(), eixt())*/ if (sig == SIGINT) {
count++;
printf("Caught SIGINT (%d)\n", count);
return; /* Resume execution at point of interruption*/
} /* Must be SIGQUIT - print a message and terminate the process*/ printf("Caught SIGQUIT - that's all forks!\n");
exit(EXIT_SUCCESS);
} int main(int argc, char* argv[])
{
if (signal(SIGINT, sigHandler) == SIG_ERR) {
errExit("signal");
}
if (signal(SIGQUIT, sigHandler) == SIG_ERR) {
errExit("signal");
} for (;;)
pause();
}
2.2. sigaction函数
a. sigaction可以一次得到设置新捕获函数和获取旧的捕获函数(其实还可以单独设置新的捕获或者单独只获取旧的捕获函数),而signal函数不能单独获取旧的捕获函数而必须在设置新的捕获函数的同时才获取旧的捕获函数。
#include <stdio.h>
#include <unistd.h> // unix standand
#include <signal.h> void func(int sig)
{
/*
if (sig == SIGALRM)
{
printf("alarm happened.\n");
}
*/
} void mysleep(unsigned int seconds); int main(void)
{
printf("before mysleep.\n");
mysleep();
printf("after mysleep.\n"); /* unsigned int ret = -1;
struct sigaction act = {0}; act.sa_handler = func;
sigaction(SIGALRM, &act, NULL); //signal(SIGALRM, func);
ret = alarm(5);
printf("1st, ret = %d.\n", ret); sleep(3); ret = alarm(5); // 返回值是2但是本次alarm会重新定5s
printf("2st, ret = %d.\n", ret);
sleep(1); ret = alarm(5);
printf("3st, ret = %d.\n", ret); //while (1);
pause();
*/
return ;
} void mysleep(unsigned int seconds)
{
struct sigaction act = {}; act.sa_handler = func;
sigaction(SIGALRM, &act, NULL); alarm(seconds);
pause();
}
PS:signal() 的行为在不同Unix实现间存在差异,这也意味着对可移植性有所追求的程序绝不能使用此调用来建立信号处理函数。故此,sigaction() 是建立信号处理器的首选API(强力推荐)
2.3. pause函数
a. 内核挂起
b. pause函数的作用就是让当前进程暂停运行,交出CPU给其他进程去执行。当当前进程进入pause状态后当前进程会表现为“卡住、阻塞住”,要退出pause状态当前进程需要被信号唤醒。
linux通信之信号的更多相关文章
- linux 进程通信之 信号
一,管道PIPE 二,FIFO通信 三,mmap通信 四,信号的概念 信号的特点:简单,但不能携带大量的信息,满足特定条件就会发生 信号的机制:进程B发送信号给进程A.信号是由内核来处理的. 信号的产 ...
- 25 Linux中的信号
Linux中的信号 信号是进程在运行过程中,由自身产生或由进程外部发过来的消息(事件).每个信号用一个整型常量宏表示,以SIG开头,比如SIGCHLD.SIGINT等,它们在系统头文件中定义,也可以通 ...
- [转]Linux进程间通信——使用信号
转载于:http://blog.csdn.net/ljianhui/article/details/10128731 经典!!! Linux进程间通信——使用信号 一.什么是信号 用过 ...
- 练习--LINUX进程间通信之信号SIGNAL
同样的,信号也不要太迷信可靠信号及不及靠信号,实时或非实时信号. 但必须要了解这些信号之间的差异,函数升级及参数,才能熟练运用. ~~~~~~~~~~~~~~~~ 信号本质 信号是在软件层次上对中断机 ...
- linux 下信号处理命令trap && linux下各种信号的意义
1.用途说明 trap是一个shell内建命令,它用来在脚本中指定信号如何处理.比如,按Ctrl+C会使脚本终止执行,实际上系统发送了SIGINT信号给脚本进程,SIGINT信号的默认处理方式就是退出 ...
- Linux系统编程——信号
目录 信号的介绍 信号的机制 信号的编号 Linux常规信号一览表 信号的产生 终端按键产生信号 硬件异常产生信号 kill函数/命令产生信号 信号的操作函数 信号集设定 sigprocmask函数 ...
- linux信号Linux下Signal信号太详细了,终于找到了
linux信号Linux下Signal信号太详细了,终于找到了 http://www.cppblog.com/sleepwom/archive/2010/12/27/137564.html
- linux系统编程--信号
信号的概念 man 7 siganl 查看man手册 信号在我们的生活中随处可见, 如:古代战争中摔杯为号:现代战争中的信号弹:体育比赛中使用的信号枪......他们都有共性:1. 简单 2. 不能 ...
- Linux 进程通信之 ——信号和信号量总结
如今最经常使用的进程间通信的方式有:信号,信号量,消息队列,共享内存. 所谓进程通信,就是不同进程之间进行一些"接触",这种接触有简单,也有复杂.机制不同,复杂度也不一 ...
随机推荐
- jdk java 环境变量配置
下载 下载JDK 64 位 wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fw ...
- .NET面试题系列(十九)Socket网络异常类型
序言 资料 异常测试之Socket网络异常
- BZOJ 5004: 开锁魔法II 期望 + 组合
Description 题面:www.lydsy.com/JudgeOnline/upload/task.pdf Input Output 一般概率题有两种套路: 满足条件的方案/总方案. 直接求概率 ...
- Codeforces 963A Alternating Sum ( 思维 && 数论 )
题意 : 题目链接 分析 : Tutorial 讲的很清楚 至于为什么这样去考虑 算是一个经验问题吧 如果一个问题要你给出模意义下的答案 就多考虑一下答案是要用逆元构造出来 也就说明有除法的存在 那么 ...
- 网页结构树DOM
引入 window对象 所有浏览器都支持 window 对象.它表示浏览器窗口. *如果文档包含框架(frame 或 iframe 标签),浏览器会为 HTML 文档创建一个 window 对象,并为 ...
- linux文件夹目录含义及用途
/boot,存放linux启动文件和内核: /initrd,boot loader initialized RAM disk,就是由boot loader初始化的内存盘.在linux内核启动前,boo ...
- 极验验证码在php5.6.27下不显示
PHP5.6需要改php.ini 去掉;always_populate_raw_post_data = -1的 :
- python-opencv学习第一章
一.opencv读入图像 retval=cv2.imread(文件名[,显示控制参数]) 常用三个参数如下 CV. IMREAD_UNCHANGED 不改变原先什么样子现在就是什么样子 CV. IMR ...
- Oracle删除表空间报ORA01548
由于undo表空间设置了自动增长,导致替换了好几个undo表空间,就想把原先的undo表空间删掉腾出空间 但删的时候报错 SQL> drop tablespace undotbs1 includ ...
- Jmeter -- 上下文关联(JSON提取器)
目标: 将请求A响应数据的部分内容提取出来,保存成变量供后续请求使用(用在返回格式为json的HTTP请求中) 步骤: 1. 添加JSON Extractor后置处理器 add --> post ...