weiqi7777

进击吧,linux(十一) 信号通讯编程

0
阅读(2045)

在各个进程间,可以通过信号通讯。不过信号是linux系统规定好的。在/usr/include/asm/signal.h中定义的。

clip_image002

可见,信号是以SIG开头,本质上信号是一个数字。


进程间信号的通信,可见下面框图:

clip_image004

所以,对于信号通讯,就有两个函数学习,一个是信号发送,一个信号处理。这个,在《unix高级环境编程》中有说明。按照之前的学习模板。

6.1发送信号

6.1.1函数名

kill

6.1.2函数原形

int kill(pid_t pid, int sig)

6.1.3函数功能

向指定进程发送信号

6.1.4所属头文件

6.1.5返回值

成功:0

失败:-1

6.1.6参数说明

pid进程的pid

大于0:向指定的pid进程发送信号。这个常用

等于0:表示向进程组中的所有进程发送信号

等于-1:向有权限的进程发送信号

小于-1:向指定的-pid进程发送信号

sig:发送的信号

6.1.7示例代码

clip_image005

使用main的两个参数,接收需要发送进程的pid号。然后使用atoi将字符串转化为数字,在调用kill函数,将信号发送出去。

6.2处理信号

6.2.1函数名

signal

6.2.2函数原形

sighandler_t signal(int signum, sighandler_t handler)

typedefvoid (*sighandler_t) (int)

6.2.3函数功能

设置信号的处理方式

6.2.4所属头文件

6.2.5返回值

成功:处理函数的指针

失败: SIG_ERR

6.2.6参数说明

signum待处理的信号

handler:对应待处理信号的方式

-SIG_IGN:忽视接收的信号

-SIG_DFL:交给内核去处理

用户自定义的函数:交给用户自定义的函数处理

6.2.7示例代码

clip_image006

使用signal,注册信号处理,使用自己定义的函数。当进程,接收到SIGINT信号后,就执行myfunc函数。这里,myfunc有一个参数,就是接收的信号。当没有接收到信号的时候,进程就等待。

测试,先将处理信号的程序运行。

clip_image008

可见,程序就停住了,因为没有接收到信号。

查看该程序的pid,得到pid25369

clip_image010

然后再运行发送信号函数,带参数,为刚刚得到的pid

clip_image012

处理信号的程序,接收到信号,然后对该信号进行处理,也就是执行我们编写的信号处理函数。打印信号的值。

Baidu
map