信号

传送给进程的事件通知,完成异步通信

信号的产生

1.程序错误:硬件异常,除数为0,等

2.外部事件:定时器事件,按键中断(ctrl+c)等

3.显示请求:调用 kill,  raise 等信号发送函数

信号的处理

#include<signal.h>

void (*signal (int sig, void(*func)(int))) (int)

定义一个返回值是函数指针的函数

signal 函数:

a) 参数1为整数,参数2为函数指针

b)返回值类型为:函数指针 void (foo*)(int)

值为:上一个处理该信号的函数

解析:

void(*signal(int sig, void(*func)(int)))(int)

signal(int sig, void(*func)(int))  -->   这是函数主体

--> 第一个入参是 int

--> 第二个入参是 void(*func)(int)

-->            这里表示入参是函数指针,

-->              类型是 void(*)(int)

外部  void(* XXX ) (int)           --> 表示函数的返回值

-->        这个返回值是个函数指针

-->           类型是 void(*)(int)

所以,如果我们 把函数指针定义一下 : typedef void(*FUN)(int)

那么,上面的函数可以写成     FUN  signal(int sig, FUN func)

信号的处理

系统默认处理

signal(XXX, SIG_DFL)               default

忽略信号

signal(XXX, SIG_IGN)                ignore

捕获信号

signal(XXX, func)

收到XXX 信号,则调用 func 函数

使用kill -l可以查询到大量的信号。如下:

1) SIGHUP 2) SIGINT  3) SIGQUIT     4) SIGILL  5) SIGTRAP

6) SIGABRT     7) SIGBUS 8) SIGFPE  9) SIGKILL 10) SIGUSR1

11) SIGSEGV     12) SIGUSR2     13) SIGPIPE 14) SIGALRM     15) SIGTERM

16) SIGSTKFLT  17) SIGCHLD     18) SIGCONT    19) SIGSTOP     20) SIGTSTP

21) SIGTTIN     22) SIGTTOU    23) SIGURG 24) SIGXCPU     25) SIGXFSZ

26) SIGVTALRM 27) SIGPROF     28) SIGWINCH  29) SIGIO   30) SIGPWR

31) SIGSYS  34) SIGRTMIN   35) SIGRTMIN+1     36) SIGRTMIN+2     37) SIGRTMIN+3

38) SIGRTMIN+4     39) SIGRTMIN+5     40) SIGRTMIN+6     41) SIGRTMIN+7     42) SIGRTMIN+8

43) SIGRTMIN+9     44) SIGRTMIN+10   45) SIGRTMIN+11   46) SIGRTMIN+12   47) SIGRTMIN+13

48) SIGRTMIN+14   49) SIGRTMIN+15   50) SIGRTMAX-14    51) SIGRTMAX-13    52) SIGRTMAX-12

53) SIGRTMAX-11    54) SIGRTMAX-10    55) SIGRTMAX-9      56) SIGRTMAX-8      57) SIGRTMAX-7

58) SIGRTMAX-6      59) SIGRTMAX-5      60) SIGRTMAX-4      61) SIGRTMAX-3      62) SIGRTMAX-2

63) SIGRTMAX-1      64) SIGRTMAX

例子:

void testSignal()

{

printf("pid:%d\n",(int)getpid());

printf("test signal!\n");

while(1);

}

在testSignal中死循环,可以使用ctrl+c,中断。

下面就对该信号进行处理:

void fun(int sig)

{

printf("receive signal:%s[%d]\n",strsignal(sig),sig);

}

void testSignal()

{

printf("pid:%d\n",(int)getpid());

printf("test signal!\n");

//ctrl+c信号处理

signal(SIGINT,fun);

while(1);

}

每一次按下ctrl+c,就会触发信号SIGINT,立即调用fun函数。使用kill 进程号。。可终止。

下面对kill信号进行处理或者忽略。

void fun(int sig)

{

printf("receive signal:%s[%d]\n",strsignal(sig),sig);

}

void testSignal()

{

printf("pid:%d\n",(int)getpid());

printf("test signal!\n");

signal(SIGINT,fun);

//kill命令的处理

signal(SIGINT,fun);

//kill命令的忽略

//signal(SIGTERM,SIG_IGN);

while(1);

}

sig就是信号的序号,strsignal(sig)就是信号的操作指令。

此时ctrl+c,kill 进程号,都无法终止进程。必须要使用 kill -9 进程号来结束进程。

注意:-9 是信号SIGKILL,此信号无法忽略和处理。

信号的忽略和恢复

void fun(int sig)

{

printf("receive signal:%s[%d]\n",strsignal(sig),sig);

//ctrl+c信号的恢复

signal(SIGINT,SIG_DFL);

//kill 的恢复

signal(SIGTERM,SIG_DFL);

}

void testSignal()

{

printf("pid:%d\n",(int)getpid());

printf("test signal!\n");

//ctrl+c信号的处理

signal(SIGINT,fun);

//kill 的忽略

signal(SIGTERM,SIG_IGN);

while(1);

}

ctrl+c,kill命令,第二次才有响应。

13信号signal的更多相关文章

  1. linux 信号signal和sigaction理解

    今天看到unp时发现之前对signal到理解实在浅显,今天拿来单独学习讨论下. signal,此函数相对简单一些,给定一个信号,给出信号处理函数则可,当然,函数简单,其功能也相对简单许多,简单给出个函 ...

  2. Linux 信号signal处理函数

    转自:http://www.cnblogs.com/taobataoma/archive/2007/08/30/875662.html alarm(设置信号传送闹钟) 相关函数 signal,slee ...

  3. python进程间通信--信号Signal

    信号signal 是python进程间通信多种机制中的其中一种机制.可以对操作系统进程的控制,当进程中发生某种原因而中断时,可以异步处理这个异常. 信号通过注册的方式‘挂’在一个进程中,并且不会阻塞该 ...

  4. Linux信号(signal)机制【转】

    转自:http://gityuan.com/2015/12/20/signal/ 信号(signal)是一种软中断,信号机制是进程间通信的一种方式,采用异步通信方式 一.信号类型 Linux系统共定义 ...

  5. Linux 信号signal处理函数--转

    alarm(设置信号传送闹钟)相关函数 signal,sleep 表头文件 #include<unistd.h> 定义函数 unsigned int alarm(unsigned int ...

  6. Linux进程间通信(一): 信号 signal()、sigaction()

    一.什么是信号 用过Windows的我们都知道,当我们无法正常结束一个程序时,可以用任务管理器强制结束这个进程,但这其实是怎么实现的呢?同样的功能在Linux上是通过生成信号和捕获信号来实现的,运行中 ...

  7. Python标准库07 信号 (signal包,部分os包)

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在了解了Linux的信号基础之后,Python标准库中的signal包就很容易学习 ...

  8. qt信号signal和槽slot机制

    内容: 一.概述 二.信号 三.槽 四.信号与槽的关联 五.元对象工具 六.程序样例 七.应注意的问题 信号与槽作为QT的核心机制在QT编程中有着广泛的应用,本文介绍了信号与槽的一些基本概念.元对象工 ...

  9. 进程间通信之信号量、消息队列、共享内存(system v的shm和mmap)+信号signal

    进程间通信方式有:System v unix提供3种进程间通信IPC:信号量.消息队列.共享内存.此外,传统方法:信号.管道.socket套接字. [注意上述6种方式只能用户层进程间通信.内核内部有类 ...

随机推荐

  1. Python 爬虫知识点 - XPath

    http://cuiqingcai.com/2621.html 一.基础介绍 <bookstore> <book> <title>Harry Potter</ ...

  2. ExtJS6的中sencha cmd中自动创建案例项目代码分析

    在之前的博文中,我们按照sencha cmd的指点,在自己win7虚拟机上创建了一个案例项目,相当于创建了一个固定格式的文档目录结构,然后里面自动创建了一系列js代码.这是使用sencha cmd自动 ...

  3. Solr服务搭建

    1.1. Solr的环境 Solr是java开发. 需要安装jdk. 安装环境Linux. 需要安装Tomcat. 1.2. 搭建步骤 第一步:把solr 的压缩包上传到Linux系统 第二步:解压s ...

  4. poj_2112 网络最大流+二分法

    题目大意 有K台挤奶机和C头奶牛,都被视为物体,这K+C个物体之间存在路径.给出一个 (K+C)x(K+C) 的矩阵A,A[i][j]表示物体i和物体j之间的距离,有些物体之间可能没有直接通路.    ...

  5. java框架---->quartz整合spring(一)

    今天我们学习一下quartz的定时器的使用.年轻时我们放弃,以为那只是一段感情,后来才知道,那其实是一生. quartz的简单实例 测试的项目结构如下: 一.pom.xml中定义quartz的依赖 & ...

  6. 【Android M】获取屏幕锁定的相关信息:“无”,“滑动”,“PIN码”,"图案","密码"

    ENV: Android M 6.0.1 import android.os.UserHandle;         import com.android.internal.widget.LockPa ...

  7. sencha touch 入门系列 (一)sencha touch 简介

    参考链接:http://mobile.51cto.com/others-278381.htm Sencha touch 是基于JavaScript编写的Ajax框架ExtJS,将现有的ExtJS整合J ...

  8. 聊聊对APM的理解

    本文主要从以下几个列举对APM的认识: -什么是APM工具 -为什么要用APM工具,APM工具的价值在哪里: -什么样的APM工具适合于传统金融业: -如何用好APM工具:    -精准告警    - ...

  9. eclipse启动报错 Problems occurred when invoking code from plug-in: "org.eclipse.jface"

    eclipse在使用中可能会发生错误: Problems occurred when invoking code from plug-in: "org.eclipse.jface" ...

  10. 微软官方:SELECT语句逻辑处理顺序

    以下步骤显示SELECT 语句的逻辑处理顺序或绑定顺序.此顺序确定在一个步骤中定义的对象何时可用于后续步骤中的子句. 例如,如果查询处理器可以绑定到(访问)在FROM 子句中定义的表或视图,则这些对象 ...