信号同样是用于进程通信的,他是一种异步通信方式。我们之前的管道不是,明显,读进程要等管道里面有数据才能运行,否则他要等待。信号处理则不同,进程不知道什么时候信号会到来,先看一小段代码,看看信号的程序:
[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 可以将...
"数字信号处理实验"的主题涵盖了信号的基本运算和变换,以及如何通过传递函数来求解系统冲激响应和阶跃响应。这些概念是数字信号处理的核心,对于理解和设计数字滤波器、通信系统以及图像处理等领域至关重要。 首先...
杨绿溪教授编写的教材《现代数字信号处理》是该领域的经典之作,其详尽的内容和精致的结构深受学生和专业人士的推崇。 数字信号处理的核心是将连续的模拟信号转换为离散的数字信号,然后通过一系列数学运算对这些...
《数字信号处理-时域离散随机信号处理答案(丁美玉)》是针对数字信号处理领域中的一个重要分支——离散随机信号处理的学习资料。...这份资源对于学习和研究数字信号处理的学者来说是一份宝贵的参考资料。
该课程结合了丁玉美教授的独特教学理念和方法,旨在帮助学生理解和掌握数字信号处理的核心原理及其在实际中的应用。下面我们将详细探讨这门课程可能涵盖的关键知识点。 1. **数字信号处理基础**:首先,课程会介绍...
本文总结了现代信号处理的知识点,包括采样理论、傅里叶变换、数字信号处理、滤波器设计、系统稳定性分析和数字滤波器等。此外,本文还强调了实践的重要性,鼓励读者通过实践来深入理解这些知识点。
通过解决这些问题,学生将能够加深对离散随机信号处理原理的理解,并提高分析和解决问题的能力。 总的来说,《数字信号处理——时域离散随机信号处理》这门课程全面涵盖了离散随机信号的理论与实践,对于想要深入...
由于提供的文件信息存在大量的乱码,且涉及的知识点属于数字信号处理的范畴,我将尝试基于您提供的文件信息,尤其是标题和描述部分,总结数字信号处理的相关知识点。请注意,由于乱码的存在,无法保证信息的准确性,...
《语音信号处理 赵力版》是赵力编著的高校通信与信息专业规划教材,该书系统地介绍了语音信号处理的基础知识、分析技术、编码、合成、识别等关键技术,并且融入了该领域近年来的新研究成果和技术进展。 语音信号...
在IT领域,数字信号处理(Digital Signal Processing,简称DSP)是一项关键的技术,它涉及对数字化的...通过上述知识点的学习和实践,可以有效地处理和分析各种数字信号,从而在音频、视频、通信等领域发挥重要作用。
matlab在振动信号处理方面的应用,包含实例解析
数字信号处理是电子工程和计算机科学的一个重要分支,它涉及到信号的数字化处理,以及如何在计算机系统中使用数学方法来分析、修改、优化和合成信号。在我们的日常生活中,信号扮演着重要的角色。信号可以是时间、...
阵列信号处理的核心目标是通过获取和处理信号,实现以下几点:增强信噪比,获取信号特征(包括信号源的数目、传输方向(定位)以及波形),分辨多个信号源。为了达到这些目标,阵列信号处理的研究内容包括检测、估计...
10. **数字信号处理的应用**:数字信号处理广泛应用于通信、音频和视频处理、医学成像、雷达和声纳系统、地震数据处理等多个领域。 这份PDF学习资料可能会涵盖以上提到的知识点,并可能通过实例、习题和案例研究来...
Simulink与信号处理 丁亦农 高清文字版.pdf本书是学习和使用Simulink对信号处理系统进行模拟和仿真的参考书籍,是笔者对多年来在MathWorks工作期间与公司软件开发人员及众多用户交流、切磋获得的经验、体会的总结和...
"现代信号分析与处理" moderne信号分析与处理是信号处理领域的重要组成部分,涉及到信号的处理、分析和应用。...这些知识点是modern信号分析与处理的基础,掌握这些知识点对于信号处理和分析非常重要。