1、信号的基本概念

信号是系统响应某个条件而产生的事件,进程接收到信号会执行相应的操作。与信号有关的系统调用在“signal.h”头文件中有声明。
常见信号的值,及对应的功能说明:

信号的值在系统源码中的定义如下:

#define SIGHUP 1
#define SIGINT 2 //键盘按下 Ctrl+c 时,会产生该信号
#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 //系统 kill 命令默认发送的信号
#define SIGSTKFLT 16
#define SIGCHLD 17 //子进程结束后,会默认给父进程发送该信
号
#define SIGCONT 18
#define SIGSTOP 19
#define SIGTSTP 20
#define SIGTTIN 21
#define SIGTTOU 22
#define SIGURG 23

2.修改信号的响应方式– signal()

2.1修改SIGINT(即Ctral+C)信号响应方式

在键盘上按下 Ctrl+c 时,会给当前终端前台执行的进程发送 SIGINT 信号,用 signal 修改 SIGINT 信号的响应方式示例代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<assert.h>
#include<signal.h>void fun(int sig)
{sleep(5);printf("sig = %d\n",sig);
}int main()
{signal(SIGINT,fun);while(1){printf("hello\n");sleep(1);}
}

fun函数在这里不是我们调用的,我们以参数形式传给signal,如果触发信号,系统会调用fun函数,所以fun函数是一个回调函数。
signal一开始并不回调fun函数,当收到信号以后,程序会中断,去处理信号问题,处理完信号问题以后,系统才会继续执行。
执行结果:

程序运行时,我们执行Ctrl+C的时候,程序会回调fun函数 ,休眠五秒钟,打印sig,处理完信号之后,然后再继续执行的程序。

2.2将修改的信号响应方式修改为默认

那么如何将信号再次修改为原来的相应方式呢?将signal的第二个参数换成SIG_DFL即可我们用程序来展示:

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<assert.h>
#include<signal.h>void fun(int sig)
{sleep(3);printf("sig = %d\n",sig);signal(SIGINT,SIG_DFL);//将信号相应方式修改为默认
}int main()
{signal(SIGINT,fun);while(1){printf("hello\n");sleep(1);}
}

运行结果:

第一次Ctral+C时系统回调fun函数,休眠5秒,输出sig,将Ctral+C响应方式又修改为默认方式,所以第二次Ctral+C时,程序正常响应信号,中断了程序的运行。

2.3忽略信号

忽略信号只需要将signal的第二个参数换成SIG_IGN即可我们用程序来展示:
代码:

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<assert.h>
#include<signal.h>int main()
{signal(SIGINT,SIG_IGN);while(1){printf("hello\n");sleep(1);}
}

运行结果:

忽略了信号Ctral+C,所以Ctral+C没有响应,程序不受影响。

3、发送信号 – kill()

kill() 可以向指定的进程发送指定的信号:

int kill(pid_t pid, int sig);

pid > 0 指定将信号发送个那个进程。

pid == 0 信号会被发送到和当前进程在同一个进程组的进程。

pid == -1 将信号发送给系统上有权限发送的所有的进程。

pid < -1 将信号发送给进程组 id 等于 pid 绝对值,并且有权限发送的所有的进程。

sig 指定发送信号的类型。

使用 kill()系统调用实现类似于系统 kill 命令的程序如下:

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<unistd.h>
#include<signal.h>//./main  pid sig三个参数
int main(int argc,char* argv[])
{if(argc != 3){printf("arg error\n");exit(0);} int pid = 0;int sig = 0;sscanf(argv[1],"%d",&pid);sscanf(argv[2],"%d",&sig);if(kill(pid,sig) == -1){perror("kill error");}exit(0);
}

test.c为一个无限输出hello的程序,运行test会不断打印hello

当我们在另一个终端找到test的pid号,用我们自己写的mykill对test发送信号。

然后发现test被中断。(2信号是SIGINT信号,就是我们使用Ctral+C发送的信号)。
#define SIGKILL 9 //该信号的响应方式不允许改变
#define SIGTERM 15 //系统 kill 命令默认发送的信号
我们将2换成9或者15,就相当于对pid执行pkill强制结束或者kill结束。9号信号不允许修改响应方式,以应对所有进程。

Linux信号的使用相关推荐

  1. Linux shell 学习笔记(12)— linux 信号、后台运行脚本、作业控制、定时运行任务

    1. 处理信号 1.1 Linux 信号 常见的 Linux 信号如下表所示: 信号 值 描述 1 SIGHUP 挂起进程 2 SIGINT 终止进程 3 SIGQUIT 停止进程 9 SIGKILL ...

  2. linux信号(signal) 机制分析

    1       信号本质 软中断信号(signal,又简称为信号)用来通知进程发生了异步事件.在软件层次上是对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的. ...

  3. linux 信号 core,Shell 信号发送与捕捉

    原标题:Shell 信号发送与捕捉 作者:李振良OK 1.Linux信号类型 信号(Signal):信号是在软件层次上对中断机制的一种模拟,通过给一个进程发送信号,执行相应的处理函数. 进程可以通过三 ...

  4. Linux信号 一 信号可靠性与分类

    开发SNMP的时候用到了Linux信号机制,总结了一下关于信号的知识. 信号是一种进程间通信手段,本质是一种软件中断,用来处理异步事件.信号机制是Unix家族里一个古老的通信机制.传统的信号机制有一些 ...

  5. linux信号使用,linux信号使用注意事项

    1.不要在信号处理函数中处理复杂的事情 2.信号处理函数中不能有互斥锁会造成死锁,可以用信号量替代 3.信号是置位方式实现,多次发送相同的信号可能只会收到一次 4.子进程具有继承父类信号屏蔽,不能在信 ...

  6. 非常好的一篇对linux信号(signal)的解析

    [摘要]本文分析了Linux内核对于信号的实现机制和应用层的相关处理.首先介绍了软中断信号的本质及信号的两种不同分类方法尤其是不可靠信号的原理.接着分析了内核对于信号的处理流程包括信号的触发/注册/执 ...

  7. 【Linux系统编程】Linux信号列表

    00. 目录 文章目录 00. 目录 01. Linux信号编号 02. 信号简介 03. 特殊信号 04. 附录 01. Linux信号编号 在 Linux 下,每个信号的名字都以字符 SIG 开头 ...

  8. linux信号以及core

    linux信号以及core 何为信号 信号(signal)用于通知进程发生了某种情况.进程有以下3种处理信号的方式: 忽略信号.有些信号表示硬件异常,例如,除以0或访问进程地址空间以外的存储单元等,因 ...

  9. linux 信号没有被处理方法,[计算机]Linux 信号signal处理机制.doc

    [计算机]Linux 信号signal处理机制 Linux 信号signal处理机制 信号是Linux编程中非常重要的部分,本文将详细介绍信号机制的基本概念.Linux对信号机制的大致实现方法.如何使 ...

  10. Linux信号实践(2) --信号分类

    信号分类 不可靠信号 Linux信号机制基本上是从UNIX系统中继承过来的.早期UNIX系统中的信号机制比较简单和原始,后来在实践中暴露出一些问题,它的主要问题是: 1.进程每次处理信号后,就将对信号 ...

最新文章

  1. 百度启动高管退休计划,总裁张亚勤今年十月退休
  2. linux 脚本设置时间戳,修改linux系统时间的方法(date命令)
  3. 廉颇老矣,尚能饭否?响鼓重擂,上阵杀敌!
  4. 前端 crypto-js aes 加解密
  5. sqllite查询数据量_详解SQLite中的查询规划器
  6. 理清逻辑,确保云原生时代应用开发的全生命周期安全
  7. /usr/bin/python^M: bad interpreter: No such file or directory
  8. mysql 删除重复数据,需要给子查询的表,起一个别名
  9. oracle clob类型ibatis,Ibatis读写CLOB数据
  10. 教您简单几步实现工业树莓派正确安装RS232转USB驱动
  11. jq ui.dialog.js简介
  12. DCDC Bootstrap自举电路
  13. 《计算机网络:自顶向下的方法》课后习题_第二章
  14. 使用Markdown如何修改图片大小
  15. discuzdiy图片模块_discuz门户模板风格diy制作
  16. IntelliJ IDEA运行内存设置
  17. 通过“单键锁配置法”实现访问控制
  18. C# textbox快捷键添加横杠
  19. Decision Transformer环境安装
  20. 晟兴地球如何添加经纬网

热门文章

  1. .net授权获取openid_Asp.Net Core 中IdentityServer4 授权中心之自定义授权
  2. [python爬虫] BeautifulSoup和Selenium对比爬取豆瓣Top250电影信息
  3. [python学习] 简单爬取维基百科程序语言消息盒
  4. 【数据结构与算法】之深入解析“二叉树的最小深度”的求解思路与算法示例
  5. 《机器学习》 —— 第二章:模型评估与选择 学习笔记
  6. struts2 简单登录校验示例
  7. 【机器视觉】 case算子
  8. 【Linux网络编程】TCP三次握手和四次挥手
  9. 【Android】 常用的Intent
  10. java多线程notifyall_Java多线程:线程状态以及wait(), notify(), notifyAll()