Linux signal()函数
这是在网易云课堂学习Linux下的signal()函数的笔记,课程链接:https://study.163.com/course/courseLearn.htm?courseId=1002913011&share=1&shareId=1024164580#/learn/video?lessonId=1003302216&courseId=1002913011
1. 函数原型
可通过man signal命令查看。

signum:要登记的信号值
handler:信号处理函数指针,可以是自定义的信号处理函数,或者SIG_IGN(忽略信号),或者SIG_DFL(采用系统默认方式处理信号)。
系统中有很多信号,每种信号都有一个宏定义,在/usr/include/bits/signum.h 文件中进行的定义。或者使用kill -l可以查看有哪些信号。

我们平时用的命令“kill -9 进程号”就是向系统发送了一个SIGKILL信号。
#define SIGKILL 9 /* Kill, unblockable (POSIX). */
2. 信号的处理
进程可以通过三种方式来响应和处理一个信号:
1)忽略信号
SIGKILL和SIGSTOP永远不能被忽略;
忽略硬件异常;
进程启动时SIGUSR1和SIGUSR2两个信号被忽略。
2)执行默认操作
每个信号有默认动作,大部分信号默认动作是终止信号。
3)捕获信号
告诉内核出现信号时调用自己的处理函数;
SIGKILL和SIGSTOP不能被捕获。
3. 测试代码
下面的测试代码是对两种信号使用自己定义的信号处理函数进行处理,这两种信号分别是:
#define SIGINT 2 /* Interrupt (ANSI). 按ctrl+c产生*/
#define SIGTSTP 20 /* Keyboard stop (POSIX). 按ctrl+z产生*/
代码如下:
1 #include <signal.h>
2 #include <stdlib.h>
3 #include <stdio.h>
4
5 // 定义信号处理函数
6 // signo:捕获到的信号
7 void sig_handler(int signo)
8 {
9 printf("%d: %d occured\n", getpid(), signo);
10 }
11
12
13 int main(void)
14 {
15 // 向内核登记信号处理函数及信号值
16 if (signal(SIGTSTP, sig_handler) == SIG_ERR) {
17 perror("signal sigtstp error");
18 }
19 if (signal(SIGINT, sig_handler) == SIG_ERR) {
20 perror("signal sigint error");
21 }
22
23 int i = 0;
24 while (i < 30) {
25 printf("%d, %d\n", getpid(), i++);
26 sleep(1);
27 }
28
29 return 0;
30 }
测试结果:

4. 其它测试1
我们将signal()相关的代码注释掉,来进行测试:
#include <signal.h>
#include <stdlib.h>
#include <stdio.h> // 定义信号处理函数
// signo:捕获到的信号
void sig_handler(int signo)
{
printf("%d: %d occured\n", getpid(), signo);
} int main(void)
{
// 向内核登记信号处理函数及信号值
// if (signal(SIGTSTP, sig_handler) == SIG_ERR) {
// perror("signal sigtstp error");
// }
// if (signal(SIGINT, sig_handler) == SIG_ERR) {
// perror("signal sigint error");
// } int i = 0;
while (i < 30) {
printf("%d, %d\n", getpid(), i++);
sleep(1);
} return 0;
}
测试结果:

可以看出,系统对SIGINT信号的默认处理方式是终止程序的运行,对SIGTSTP信号的默认处理方式是暂停程序的运行。

我们可以使用SIGCONT信号来让程序继续运行:kill -SIGCONT 3131。
5. 其它测试2
使用忽略的方式SIG_IGN来处理信号:
1 #include <signal.h>
2 #include <stdlib.h>
3 #include <stdio.h>
4
5 // 定义信号处理函数
6 // signo:捕获到的信号
7 void sig_handler(int signo)
8 {
9 printf("%d: %d occured\n", getpid(), signo);
10 }
11
12
13 int main(void)
14 {
15 // 向内核登记信号处理函数及信号值
16 if (signal(SIGTSTP, sig_handler) == SIG_ERR) {
17 perror("signal sigtstp error");
18 }
19 if (signal(SIGINT, SIG_IGN) == SIG_ERR) {
20 perror("signal sigint error");
21 }
22
23 int i = 0;
24 while (i < 30) {
25 printf("%d, %d\n", getpid(), i++);
26 sleep(1);
27 }
28
29 return 0;
30 }
测试结果:

可以看出,使用忽略方式并没有捕获到信号SIGINT,SIG_IGN方式把SIGINT忽略掉了。
Linux signal()函数的更多相关文章
- linux signal函数遇到的问题
1.关于signal函数的定义 signal最开始的原型是这: void (*signal(int signo, void (*func)(int)))(int);看过下面两行,了解到上面这一行是这个 ...
- [linux]signal函数不起作用
#include "apue.h" #include <sys/wait.h> static void sig_int(int); /* our signal-catc ...
- Signal ()函数详细介绍 Linux函数
http://blog.csdn.net/ta893115871/article/details/7475095 Signal ()函数详细介绍 Linux函数 signal()函数理解 在<s ...
- Signal ()函数详细介绍 Linux函数(转)
Signal ()函数详细介绍 Linux函数 收藏人:紫火神兵 2012-09-27 | 阅:5659 转:22 | 来源 | 分享 signa ...
- 三十、Linux 进程与信号——信号的概念及 signal 函数
30.1 信号的基本概念 信号(signal)机制是Linux 系统中最为古老的进程之间的通信机制,解决进程在正常运行过程中被中断的问题,导致进程的处理流程会发生变化 信号是软件中断 信号是异步事件 ...
- Linux下利用signal函数处理ctrl+c等信号
前言 linux下能够通过信号机制来实现程序的软中断,是一个很实用的编程方法. 我们平时在程序执行的时候按下ctrl-c.ctrl-z或者kill一个进程的时候事实上都等效于向这个进程发送了一个特定信 ...
- Linux 信号(二)—— signal 函数
弗洛伊德认为:要解决这些苦恼,当事人就要通过回忆并理解自己早期的童年经历,来获得对潜意识冲突的顿悟.弗洛伊德的疗法被称为“精神分析” (psychoanalysis),在 20 世纪的很长一段时间被心 ...
- Linux 信号详解一(signal函数)
信号列表 SIGABRT 进程停止运行 SIGALRM 警告钟 SIGFPE 算述运算例外 SIGHUP 系统挂断 SIGILL 非法指令 SIGINT 终端中断 SIGKILL 停止进程(此信号不能 ...
- signal()函数
转自:http://blog.csdn.net/sddzycnqjn/article/details/7285760 1. 信号概念 信号是进程在运行过程中,由自身产生或由进程外部发过来的消息(事件) ...
- signal函数、sigaction函数及信号集(sigemptyset,sigaddset)操作函数
信号是与一定的进程相联系的.也就是说,一个进程可以决定在进程中对哪些信号进行什 么样的处理.例如,一个进程可以忽略某些信号而只处理其他一些信号:另外,一个进程还可以选择如何处理信号.总之,这些总与特定 ...
随机推荐
- 实训篇-JavaScript-陶渊明去没去过桃花源
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- CentOS 7.9编译安装Python-3.10.13
目录 查看CentOS版本.系统默认gcc版本.Python版本和pip版本 部署Python-3.10.13 测试 将yum中的Python版本修改为系统原来的2.7.5版本 查看CentOS版本. ...
- 了解redis的单线程模型工作原理?一篇文章就够了
1.首先redis是单线程的,为什么redis会是单线程的呢?从redis的性能上进行考虑,单线程避免了上下文频繁切换问题,效率高:从redis的内部结构设计原理进行考虑,redis是基于Reacto ...
- HL7标准的版本
HL7V2 HL7v2是用于在系统之间交换临床和患者信息的最广泛使用的医疗保健消息传递标准.HL7v2的目标是使用代表临床事件信息的标准化消息(例如患者管理活动.人口统计.医疗订单.结果和财务信息)在 ...
- 力扣598(java)-范围求和Ⅱ(简单)
题目: 给你一个 m x n 的矩阵 M ,初始化时所有的 0 和一个操作数组 op ,其中 ops[i] = [ai, bi] 意味着当所有的 0 <= x < ai 和 0 <= ...
- 提质增效,安全灵活,阿里云EDA上云方案让芯片设计驶入高速路
简介: 今天下午14点,直播间等你 导语:随着芯片工艺的跃升,EDA 需要越来越大的计算能力,处理高达PB级的海量数据.传统的算力交付模式已无法跟上快速发展的芯片设计行业,云的快速交付与强大生态提供了 ...
- Kubernetes 稳定性保障手册 -- 可观测性专题
简介: 伴随大家对稳定性重视程度的不断提升.社区可观测性项目的火热,可观测性成为了一个很热门的话题,站在不同的角度会产生不同的理解. 我们从软件开发的生命周期出发,尝试形成对可观测性的一个宏观理解,并 ...
- 一文搞懂物联网Modbus通讯协议
简介: 一般来说,常见的物联网通讯协议众多,如蓝牙.Zigbee.WiFi.ModBus.PROFINET.EtherCAT.蜂窝等.而在众多的物联网通讯协议中,Modbus是当前非常流行的一种通讯协 ...
- [GPT] Vue 的 methods 中使用了 addEventListener,如何在 addEventListener 的匿名函数参数中访问 Vue data 变量
在 Vue 的 methods 方法中使用 addEventListener时,你可以使用 箭头函数 来访问 Vue 实例的数据. 箭头函数不会创建自己的作用域,而是继承父级作用域的上下文.以下是 ...
- Solution Set - LCT
A[洛谷P3690]维护一个森林,支持询问路径xor和,连边(已连通则忽略),删边(无边则忽略),改变点权. B[洛谷P3203]\(n\)个装置编号为\(0,...,n-1\),从\(i\)可以一步 ...