你的位置:首页 > 软件开发 > 操作系统 > UNIX高级环境编程(13)信号

UNIX高级环境编程(13)信号

发布时间:2015-05-08 20:00:18
信号就是软中断。信号提供了异步处理事件的一种方式。例如,用户在终端按下结束进程键,使一个进程提前终止。 1 信号的概念每一个信号都有一个名字,它们的名字都以SIG打头。例如,每当进程调用了abort函数时,都会产生一个SIGABRT信号。每一个信号对应一个正整数,定义在 ...

UNIX高级环境编程(13)信号

信号就是软中断。

信号提供了异步处理事件的一种方式。例如,用户在终端按下结束进程键,使一个进程提前终止。

 

1 信号的概念

每一个信号都有一个名字,它们的名字都以SIG打头。例如,每当进程调用了abort函数时,都会产生一个SIGABRT信号。

每一个信号对应一个正整数,定义在头文件<signal.h>中。

没有信号对应整数0,kill函数使用信号编号0表示一种特殊情况,所以信号编号0又叫做空信号(null signal)。

下面的各种情况会产生一个信号:

  • 当用户在终端按下特定的键时,会产生信号。例如,当用户按下DELETE按键(或Control-C)时,会产生一个中断信号(interrupt signal,SIGINIT),该信号使得一个运行中的程序终止。
  • 硬件异常可以产生信号。会引发硬件异常的情况如除以0,非法内存引用(invalid memory reference)等。这种情况会被硬件检测到,并通知内核,然后内核产生相应的信号通知对应的运行进程。例如,当一个进程执行了一个非法的内存引用,会触发SIGSEGV信号。 
  • kill函数允许当前进程向其他的进程或者进程组发送任意的信号。当然,这种方法存在限制:我们必须是信号接收进程的所有者,或者我们必须是超级用户(superuser)。
  • kill命令的作用和kill函数类似。这个命令多用户杀死后台进程。
  • 软件异常可以根据不同的条件产生不同的信号。例如:网络连接中接受的数据超出边界时,会触发SIGURG信号。

对于进程来说,信号是随机产生的,所以进程不能简单地根据检测某个变量是否改变来判断信号是否发生,而应该告诉内核“当这个信号发生时,做下面的这些事情”。

我们告诉内核当某个信号发生时做的事情叫做信号处理函数。信号处理函数有三种功能可供选择:

 

  • 忽略该信号。该行为适用于大部分的信号,除了两个信号不能被忽略:SIGKILL和SIGSTOP。这两个信号无能被忽略,是因为其作用是为内核和超级用户提供了一种杀死或者暂停进程的万无一失的方法(a surefire way)。
  • 捕获该信号。当某个信号发生时,我们告诉进程去执行我们的一段程序。在该程序中,我们可以做任何操作来处理该种情况。两个信号SIGKILL和SIGSTOP不可以被捕获。
  • 执行默认的信号处理程序。每个信号都有一个默认的处理程序,而大部分的信号默认处理程序都是终止该进程。

对于一些信号发生时,会造成进程终止,同时生成一个core文件,该core文件记录了该进程终止时的内存情况,可以帮助调试和调查进程的终止状态。

有几种情况不会生成core文件:

  • 如果进程设置了suid位(chmod u+s file),并且当前用户不是程序文件的所有者;
  • 如果进程设置了guid位(set-group-ID),并且当前用户不是程序文件的组所有者;
  • 如果过户没有当前工作目录的写权限;
  • 如果core文件已经存在,并且用户没有该文件的写权限;
  • 该core文件太大(由参数RLIMIT_CORE限制) 

2 signal函数

函数声明

#include <signal.h>

void (*signal(int signo, void (*func)(int)))(int);

    Returns: previous disposition of signal if OK, SIG_ERR on err.

 函数声明解析:

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

 

海外公司注册、海外银行开户、跨境平台代入驻、VAT、EPR等知识和在线办理:https://www.xlkjsw.com

原标题:UNIX高级环境编程(13)信号

关键词:

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

可能感兴趣文章

我的浏览记录