信号同样是用于进程通信的,他是一种异步通信方式。我们之前的管道不是,明显,读进程要等管道里面有数据才能运行,否则他要等待。信号处理则不同,进程不知道什么时候信号会到来,先看一小段代码,看看信号的程序:
[root@liumengli signal]# cat ./signal_recive1.c
#include "stdio.h"
#include "signal.h"
#include "sys/types.h"
#include "unistd.h"
void new_op(int, siginfo_t *, void *);
int main(int argc, char**argv) {
struct sigaction act; //创建新的信号
struct sigaction old_act; //用与记录旧的信号,当然你也可以不用记录
int sig; //信号量,将来我们发送的信号要以这个信号量发送
sig = atoi(argv[1]);
sigemptyset(&act.sa_mask);
act.sa_flags = SA_SIGINFO;
act.sa_sigaction = new_op; //设置信号的响应操作
if(sigaction(sig, &act, &old_act) < 0) { //开始创建信号
printf("install sigal error\n");
return 1;
}
while(1) { //为了测试写的一个死循环
sleep(2);
printf("Now we wait for signal\n");
}
}
void new_op(int signum, siginfo_t * info, void * myact) { //信号的响应操作
printf("recive signal %d\n", signum);
exit(1);
}
[root@liumengli signal]# ./signal_recive1 15
(我们以15号信号作为新的信号的信号量,我们即将发送就发送15好给目标进程,注意我们这里是用掉了系统的15号信号,这个信号是可以被从写的,但有2个信号KILL和STOP信号,KILL的信号是9,而STOP是根据硬件结构体系而不同,他们是不能被从写的,原因是,内核代码中在安装信号上有这么一句(act && (sig == SIGKILL || sig == SIGSTOP)))
return -EINVAL;同时他们不能被屏蔽也就是不能被不响应,其它信号是可以屏蔽的。这么做的原因是内核设计者为了给进程控制留下的最后底限,绝大部分信号的默认操作是终止进程,这个2个从名字上也看出一个是终止,另一个是暂停。这样我们对一个进程至少有最后的杀死手段就是向进程发送这2种信号,如何法后面会看到)
Now we wait for signal
Now we wait for signal
Now we wait for signal
Now we wait for signal
.......
另开一个终端
[root@liumengli signal]# ps -le
......
0 S 0 30681 28333 0 75 0 - 352 hrtime pts/2 00:00:00 signal_recive1
0 R 0 30828 28245 0 78 0 - 1368 - pts/1 00:00:00 ps
[root@liumengli signal]# kill -15 30681
再返回看看被这个进程掌控的终端的反应
Now we wait for signal
recive signal 15
[root@liumengli signal]#
按照我们预期的结束了。
先解释下kill指令,这是发送信号的一个指令,当然我们可以用函数(linux提供了),我们发送了15号信号,按照我们预期的结束了。通常人们认为 kill是杀死一个进程,其实不是,它是发送一个信号给你指定的进程,觉大部分进程不会去改系统的信号量,如果真的改了,他们改不了STOP和KILL这2个信号量,我改过,运行时候报了信号安装失败。如果你杀不死一个流氓进程的时候,不妨试试 kill -KILL目标进程的PID,kill -STOP是个蛮好玩的信号,可以试试,想恢复就发送kill -CONT.另一个,写过linux/unix环境编程的人会清楚知道,就算进程不是就绪状态,发送信号是会将它改成就绪态,这个看下发送信号的源代码就知道了,他会把目标进程挂到就绪队列中。所以睡眠进程也会响应信号。
从我的程序中看出我没有哪儿有代码去检测一个信号是否到来,既用户并不关心信号什么时候会到来,用户关心的是信号来了我该做些什么。那么谁去检测信号是否到来的,换句话说就是:信号检测的代码写在哪里。它写在
217 ret_with_reschedule:
218 cmpl $0,need_resched(%ebx)
219 jne reschedule
220 cmpl $0,sigpending(%ebx)
221 jne signal_return
这段代码的第220行就是检测信号,以前我们看过进程调度,进程调度代码写在218行。这段代码会在任何返回用户空间时候会被执行,包括系统调用返回,中断返回,异常处理返回从睡眠唤醒的时候返回。
如果你的程序一直在用户空间,而且不会受到任何中断(不太可能实现,至少定时的时钟中断会来骚扰下,而且没有系统调用的支持,直接自己去操作一些硬件也不太可能),那么信号是不会被响应的。
从响应的角度来说,不是我发信号,对方就会立即反应,这中间会有延时,这个不难理解了。
分享到:
相关推荐
本课程设计报告的主要目的是为了学习和掌握数字信号处理的基本原理和技术,并通过设计和实现来巩固所学的知识。 一、信号DFT处理 在数字信号处理中,离散傅里叶变换(DFT)是一种常用的信号处理技术。DFT 可以将...
然而,在许多实际应用中,如地震勘探、水声信号处理和生物医学工程等领域,信号和噪声往往表现为非高斯分布。在这种情况下,基于二阶统计量的方法可能会导致系统性能下降。因此,研究非高斯信号处理变得尤为重要。高...
雷达信号处理和数据处理.
数字信号处理是现代信息技术的一个重要分支,它涉及信号的采集、变换、处理、分析和解释等环节。时域离散随机信号处理是数字信号处理的一个重要组成部分,主要研究时域离散条件下随机信号的分析和处理方法。在工程和...
"数字信号处理实验"的主题涵盖了信号的基本运算和变换,以及如何通过传递函数来求解系统冲激响应和阶跃响应。这些概念是数字信号处理的核心,对于理解和设计数字滤波器、通信系统以及图像处理等领域至关重要。 首先...
杨绿溪教授编写的教材《现代数字信号处理》是该领域的经典之作,其详尽的内容和精致的结构深受学生和专业人士的推崇。 数字信号处理的核心是将连续的模拟信号转换为离散的数字信号,然后通过一系列数学运算对这些...
本文总结了现代信号处理的知识点,包括采样理论、傅里叶变换、数字信号处理、滤波器设计、系统稳定性分析和数字滤波器等。此外,本文还强调了实践的重要性,鼓励读者通过实践来深入理解这些知识点。
由于提供的文件信息存在大量的乱码,且涉及的知识点属于数字信号处理的范畴,我将尝试基于您提供的文件信息,尤其是标题和描述部分,总结数字信号处理的相关知识点。请注意,由于乱码的存在,无法保证信息的准确性,...
《数字信号处理-时域离散随机信号处理答案(丁美玉)》是针对数字信号处理领域中的一个重要分支——离散随机信号处理的学习资料。...这份资源对于学习和研究数字信号处理的学者来说是一份宝贵的参考资料。
在IT领域,数字信号处理(Digital Signal Processing,简称DSP)是一项关键的技术,它涉及对数字化的...通过上述知识点的学习和实践,可以有效地处理和分析各种数字信号,从而在音频、视频、通信等领域发挥重要作用。
《语音信号处理 赵力版》是赵力编著的高校通信与信息专业规划教材,该书系统地介绍了语音信号处理的基础知识、分析技术、编码、合成、识别等关键技术,并且融入了该领域近年来的新研究成果和技术进展。 语音信号...
matlab在振动信号处理方面的应用,包含实例解析
数字信号处理是电子工程和计算机科学的一个重要分支,它涉及到信号的数字化处理,以及如何在计算机系统中使用数学方法来分析、修改、优化和合成信号。在我们的日常生活中,信号扮演着重要的角色。信号可以是时间、...
10. **数字信号处理的应用**:数字信号处理广泛应用于通信、音频和视频处理、医学成像、雷达和声纳系统、地震数据处理等多个领域。 这份PDF学习资料可能会涵盖以上提到的知识点,并可能通过实例、习题和案例研究来...
阵列信号处理的核心目标是通过获取和处理信号,实现以下几点:增强信噪比,获取信号特征(包括信号源的数目、传输方向(定位)以及波形),分辨多个信号源。为了达到这些目标,阵列信号处理的研究内容包括检测、估计...
本课件集合了该课程的重要内容,旨在帮助学生深入理解并掌握数字信号处理的基本原理和应用。 在“数字信号处理总复习.ppt”中,我们可以期待涵盖以下几个关键知识点: 1. **数字信号与模拟信号**:首先,会介绍...
数字信号处理是指对数字信号进行分析、变换、综合、识别等操作,以提取有用信息和达到特定的目的。数字信号处理系统的功能包括谱估计、数据压缩、滤波等。 时域离散信号是指在离散时间上定义的信号,独立对信号进行...
数字信号处理是现代电子和通信系统中不可或缺的一部分,它涉及数字系统对信号的分析和处理。信号处理的目的通常是为了改善信号的品质,提取有用的信息,或是使信号能够适应特定的传输或存储需求。 首先,我们来探讨...
《基于MATLAB的数字信号处理和仿真》 数字信号处理(DSP)是现代电子技术、计算机科学和通信技术的重要组成部分,其主要目标是对现实世界中的连续模拟信号进行测量、转换、滤波、检测等处理。MATLAB作为一种强大的...