weiqi7777

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

0
阅读(2262)

 

         在各个进程间,可以通过信号通讯。不过信号是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 所属头文件

   <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 示例代码

   clip_image005

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

6.2 处理信号

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 示例代码

   clip_image006

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

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

clip_image008

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

         查看该程序的pid,得到pid25369

clip_image010

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

clip_image012

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