进击吧,linux(十一) 信号通讯编程
0赞
在各个进程间,可以通过信号通讯。不过信号是linux系统规定好的。在/usr/include/asm/signal.h中定义的。
可见,信号是以SIG开头,本质上信号是一个数字。
进程间信号的通信,可见下面框图:
所以,对于信号通讯,就有两个函数学习,一个是信号发送,一个信号处理。这个,在《unix高级环境编程》中有说明。按照之前的学习模板。
6.1.1 函数名
kill
6.1.2 函数原形
int kill(pid_t pid, int sig)
6.1.3 函数功能
向指定进程发送信号
6.1.4 所属头文件
<sys/types.h> <signal.h>
6.1.5 返回值
成功: 0
失败: -1
6.1.6 参数说明
pid: 进程的pid号
大于0:向指定的pid进程发送信号。这个常用
等于0:表示向进程组中的所有进程发送信号
等于-1:向有权限的进程发送信号
小于-1:向指定的-pid进程发送信号
sig: 发送的信号
6.1.7 示例代码
使用main的两个参数,接收需要发送进程的pid号。然后使用atoi将字符串转化为数字,在调用kill函数,将信号发送出去。
6.2.1 函数名
signal
6.2.2 函数原形
sighandler_t signal(int signum, sighandler_t handler)
typedef void (*sighandler_t) (int)
6.2.3 函数功能
设置信号的处理方式
6.2.4 所属头文件
<signal.h>
6.2.5 返回值
成功:处理函数的指针
失败: SIG_ERR
6.2.6 参数说明
signum: 待处理的信号
handler:对应待处理信号的方式
-SIG_IGN: 忽视接收的信号
-SIG_DFL: 交给内核去处理
用户自定义的函数:交给用户自定义的函数处理
6.2.7 示例代码
使用signal,注册信号处理,使用自己定义的函数。当进程,接收到SIGINT信号后,就执行myfunc函数。这里,myfunc有一个参数,就是接收的信号。当没有接收到信号的时候,进程就等待。
测试,先将处理信号的程序运行。
可见,程序就停住了,因为没有接收到信号。
查看该程序的pid,得到pid是25369。
然后再运行发送信号函数,带参数,为刚刚得到的pid。
处理信号的程序,接收到信号,然后对该信号进行处理,也就是执行我们编写的信号处理函数。打印信号的值。