Linux系统编程之进程间通信(信号)

信号(signal):
信号的基本概念:
信号是事件发生时对进程的通知机制,有时也叫,信号可以让一个正运行进程被另一个运行进程异步进程中断,转而处理某突发事件。

注意:信号的产生和处理都是由内核完成

简单说一下使内核为进程产生信号的事件有:

1 终端发特殊字符,如CTRL+C 对前台进程发送中断信号
2 硬件发生异常,如被0除等异常机器语言指令。
3 系统状态变化:如alarm定时器到期引起SIGALRM信号,进程某个子进程退出
4 运行kill 命令/函数。

信号使用的目的:
1.让进程知道发生了一件特定的事情。
2.强迫进程执行自己的信号处理程序。

特点:
简单,但不能携带大量的信息,满足特定条件才发送信号,其优先级比较高。

命令:
在linux下用 查看信号列表 前31为常规信号,后面的是实时信号。

信号列表:
linux下的信号专用名、定义值和默认反映

Linux系统编程之进程间通信(信号)
Linux系统编程之进程间通信(信号)

.c

发信号: ps -aux|grep a.out
例如:kill -2 进程id

简单的总结一下,我们通过 signal 函数注册一个信号处理函数,分别注册了两个信号(SIGIO 和
SIGUSER1);随后主程序就一直“长眠”了。 通过 kill 命令发送信号之前,我们需要先查看到接收者,通过 ps
命令查看了之前所写的程序的 PID,通过 kill 函数来发送。 对于已注册的信号,使用 kill
发送都可以正常接收到,但是如果发送了未注册的信号,则会使得应用程序终止进程。

那么,已经可以设置信号处理函数了,信号的处理还有两种状态,分别是默认处理和忽略,这两种设置很简单,只需要将 handler 设置为SIG_IGN(忽略信号)或 SIG_DFL(默认动作)即可。

在此还有两个问题需要说明一下:
1.当执行一个程序时,所有信号的状态都是系统默认或者忽略状态的。除非是 调用exec进程忽略了某些信号。exec 函数将原先设置为要捕捉的信号都更改为默认动作,其他信号的状态则不会改变 。
2.当一个进程调动了 fork 函数,那么子进程会继承父进程的信号处理方式。

我们看到以上有三个demo,.c 是用signal来捕获信号,,并做相应的处理,记住这是接收信号函数,发送的还是,我们可以在终端命令行用指令向.c发送信号,.c 是执行忽略信号的处理,但记住上面说过的和是不能被忽略,捕捉的,只能执行默认动作

那么入门版的信号注册函数看完了,那么现在我们来看一下入门版的信号的发送函数
.c

从代码中可以看出,向一个进程发送信号是用函数来发送,或者是用system来对进程发送信号

信号注册函数高级版—-sigaction
函数原型:

来源:嵌入式软件工程师

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2022年4月14日
下一篇 2022年4月14日

相关推荐