一. 信号介绍

  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通信之信号的更多相关文章

  1. linux 进程通信之 信号

    一,管道PIPE 二,FIFO通信 三,mmap通信 四,信号的概念 信号的特点:简单,但不能携带大量的信息,满足特定条件就会发生 信号的机制:进程B发送信号给进程A.信号是由内核来处理的. 信号的产 ...

  2. 25 Linux中的信号

    Linux中的信号 信号是进程在运行过程中,由自身产生或由进程外部发过来的消息(事件).每个信号用一个整型常量宏表示,以SIG开头,比如SIGCHLD.SIGINT等,它们在系统头文件中定义,也可以通 ...

  3. [转]Linux进程间通信——使用信号

    转载于:http://blog.csdn.net/ljianhui/article/details/10128731         经典!!! Linux进程间通信——使用信号 一.什么是信号 用过 ...

  4. 练习--LINUX进程间通信之信号SIGNAL

    同样的,信号也不要太迷信可靠信号及不及靠信号,实时或非实时信号. 但必须要了解这些信号之间的差异,函数升级及参数,才能熟练运用. ~~~~~~~~~~~~~~~~ 信号本质 信号是在软件层次上对中断机 ...

  5. linux 下信号处理命令trap && linux下各种信号的意义

    1.用途说明 trap是一个shell内建命令,它用来在脚本中指定信号如何处理.比如,按Ctrl+C会使脚本终止执行,实际上系统发送了SIGINT信号给脚本进程,SIGINT信号的默认处理方式就是退出 ...

  6. Linux系统编程——信号

    目录 信号的介绍 信号的机制 信号的编号 Linux常规信号一览表 信号的产生 终端按键产生信号 硬件异常产生信号 kill函数/命令产生信号 信号的操作函数 信号集设定 sigprocmask函数 ...

  7. linux信号Linux下Signal信号太详细了,终于找到了

    linux信号Linux下Signal信号太详细了,终于找到了 http://www.cppblog.com/sleepwom/archive/2010/12/27/137564.html

  8. linux系统编程--信号

    信号的概念 man 7 siganl  查看man手册 信号在我们的生活中随处可见, 如:古代战争中摔杯为号:现代战争中的信号弹:体育比赛中使用的信号枪......他们都有共性:1. 简单 2. 不能 ...

  9. Linux 进程通信之 ——信号和信号量总结

    如今最经常使用的进程间通信的方式有:信号,信号量,消息队列,共享内存.       所谓进程通信,就是不同进程之间进行一些"接触",这种接触有简单,也有复杂.机制不同,复杂度也不一 ...

随机推荐

  1. 浅谈Mybatis通用Mapper使用方法_java - JAVA

    文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 对单表进行增删改查是项目中不可避免的需求,Mybatis的通用Mapper插件使这些操作变得简单 添加maven依赖 在 ...

  2. 使用swagger生成API说明文档

    使用swagger生成API说明文档本文由个人总结,如需转载使用请标明原著及原文地址没有导出!!!!!不要整天给我留言导出呢,那个是你们百度的时候下面的推荐文章带的关键字,要做导出从swagger取数 ...

  3. @JsonView注解指定返回的model类中显示的字段

    1.User类 package com.imooc.model; import com.fasterxml.jackson.annotation.JsonView; /** * @author oy ...

  4. 【模板】【数论】二次剩余Cipolla算法,离散对数BSGS 算法

    Cipolla LL ksm(LL k,LL n) { LL s=1; for(;n;n>>=1,k=k*k%mo) if(n&1) s=s*k%mo; return s; } n ...

  5. windows下开启远程连接Mysql

    使用“Ctrl + R”组合键快速打开cmd窗口,并输入“cmd”命令,打开cmd窗口.  使用“mysql -uroot -proot”命令可以连接到本地的mysql服务.  使用“use mysq ...

  6. easyui 功能列传递一行数据

    DeleteRow(' + JSON.stringify(row).replace(/"/g, '"') + ',0,' + Pindex + ',' + index + ')

  7. sqli-lab(37)

    0X01 看看源码 what is mean? 定义和用法 mysql_real_escape_string() 函数转义 SQL 语句中使用的字符串中的特殊字符. 下列字符受影响: \x00 \n ...

  8. lianjie3

    http://7xj7xs.com1.z0.glb.clouddn.com/xiao-chengxu.mp4

  9. 深入浅出mysql笔记---0、序

    深入浅出mysql笔记---0.序 一.总结 一句话总结: 心得:买书之前建议先找找电子书,纸质书太难带了 1.开源作用? 开源对mysql的发展至关重要 2.mysql在2002年就全面支持了事务, ...

  10. sqlite的系统表sqlite_master

      SQLite数据库中一个特殊的名叫 SQLITE_MASTER 上执行一个SELECT查询以获得所有表的索引.每一个 SQLite 数据库都有一个叫 SQLITE_MASTER 的表, 它定义数据 ...