linux应用程序开发入门——信号之signal函数

  • xidianzxc
  • LV3工程师
  • |      2015-03-24 01:45:29
  • 浏览量 755
  • 回复:2

今天我们来谈谈linux中的信号。我们知道linux是一个多进程的操作系统,系统中同时存在运行着多个进程。在一个进程的运行过程中,如果某一时间突然发生了一件事,系统需要通知某个进程,然后这个进程就能根据突发的情况做出相应的处理,感觉有点像硬件上的中断。Linux使用一种叫做信号的机制来进行进程间的通信,来完成处理突发的事件。信号并不传送具体的数据,只是告诉进程发生了某种事件,这些信号都有具体的编号,就像我们在硬件上的中断也有中断编号一样。

通过上面,我们可以看到,信号的本质其实就是软中断,用于异步事件的处理。当一个进程收到一个信号,我们的进程怎么来处理呢,进程有三种处理信号的方法:

  1.      我们自己编写针对特定信号的处理函数,有点像硬件上的中断处理函数

  2.       如果这个信号,我们不关心,那么我们可以选择忽略这个信号,就是什么也不做

  3.       如果,这种信号我们不用特别的处理,那我们可以用系统默认的处理方法

       知道了这么多,那么我们在程序中如何做呢?介绍一下我们需要用到的函数signal()signal 函数用来指定进程对某个信号的处理行为。我们来看下函数原型:

void (*signal(int signum, void(*handler)(int)))(int);

这个函数原型初看,简直叫一个晕,那么我们换一种方式来写,如下:

typedef void(*sighandler)(int);

sighanlder signal(int signum, sighandler handler);

好像还是有点绕,那我们来多说几句,第一句定义了一个sighandler的类型,这个类型有一个int型的参数,并且返回值是一个void型的指针。第二句中,函数整体是我们之前定义的sighandler类型的,也就说,这个函数整体的返回值是一个void型函数的指针,并且这个函数有一个int型的参数,最绕的是,这个signal函数中第二个参数也是sighandler型的。好了我们对比一下最原始的signal函数的原型,大家可以看看到底是不是这样。Signal函数的第一个参数比较简单,就是我们指定信号的值,这是一个整数,就是我们信号的编号,我们的指定的每一个信号都是有编号的。那么我们怎么知道这些信号的编号呢?

我们在系统中输入kill –l 命令就可以了,如下:

linux应用程序开发入门——信号之signal函数

图中全是大写的字符串就是信号的名字,这都是固定的,信号名字前面的编号就是信号在系统中的编号了。

Signal函数的第二个参数指定了信号的处理方式,分别对应了我们之前说的信号的三种处理方法:

1.       我们自己编写的信号处理函数的地址,也就是写上函数的名字

2.       SIG_IGN 忽略这个信号

3.       SIG_DFL 使用系统默认的处理方法

好,我们来举个简单的例子:

       linux应用程序开发入门——信号之signal函数

main函数中,第一句我们就调用了signal函数,我们制定的信号是SIGINT,我们可从之前那张表看到,SIGINT的编号为2signal函数第二个参数我们写的是我们自己写的信号处理函数的名字,也就是函数的指针,我们可以看看SignHandler(int )void型,也就是我们之前函数原型中说的返回无类型指针。它的参数是一个int型,严格符合signal函数的原型中第二个参数的定义。这里信号处理函数中的int 型参数,其实就是制定信号的编号。

main函数接下来就是一个死循环,等待信号的触发,然后调用SignHandler()函数来打印出一条信息,显示信号的编号。

好,我们来编译运行一下:

       linux应用程序开发入门——信号之signal函数

图中,红线部分是我从键盘输入的Ctr + c,也就是windows中的复制快捷键,这会产生一个SIGINT信号,SIGINT的系统默认处理方式是终止一个进程,但是这里因为我们改写了它的处理函数,所以它不再具有终止进程的作用,而是打印出一条信息,也就是图中蓝线的部分。

如果,我们想忽略一个信号,我们这里仍然用SIGINT这个信号来举例:

       linux应用程序开发入门——信号之signal函数

我们来编译运行一下:

       linux应用程序开发入门——信号之signal函数

我么可以看到,因为忽略里这个信号,当我们在键盘上输入Ctr + c 时,没有任何的反应了。

好了,今天小白我就写到这里~


这个系类的笔记汇总贴在:linux应用程序开发入门笔记系列,欢迎大家交流指正~

 

  • 0
  • 收藏
  • 举报
  • 分享
我来回复

登录后可评论,请 登录注册

所有回答 数量:2
MariannaZhu 2015-05-18
写得真好!楼主加油
0   回复
举报
发布
Chen Yang 2015-05-06
顶贴  帖子学的不错
0   回复
举报
发布
x
收藏成功!点击 我的收藏 查看收藏的全部帖子