Linux 信号

信号概念

信号(signal)是一种进程间通信机制,它给应用程序提供一种异步的软件中断,使应用程序有机会接受其他程序活终端发送的命令(即信号)。

应用程序收到信号后,有三种处理方式:

  忽略

  默认

  捕捉

进程收到一个信号后,会检查对该信号的处理机制。

  如果是SIG_IGN,就忽略该信号;

  如果是SIG_DFT,则会采用系统默认的处理动作,通常是终止进程或忽略该信号;

  如果给该信号指定了一个处理函数(捕捉),则会中断当前进程正在执行的任务,转而去执行该信号的处理函数,返回后再继续执行被中断的任务。

信号来源

信号是传送给进程的一种事件通知,生成信号的事件有三大类:

  1、程序错误:除零,非法内存访问...

  2、外部信号:终端Ctrl-C产生SGINT信号, Ctrl-\,产生SGQUIT信号,定时器到期产生SIGALRM等

  3、外部程序:kill函的数允许进程发送任何信号给其他进程或进程组。

Linux/i386中的部分信号

 信号举例:“Ctrl+c”组合键

 假设用户在console下按下“ctrl+c”,这将产生终端中断

  tty驱动程序能识别出这个组合键,并向自己的前台进程发送一个SIGINT信号。

  当对应进程被调度执行时,它将在上下文切换返回到用户态时检查到这个信号。

  此外,通常前台进程就是被ctrl+c中断的current进程。当进程从中断返回时,也会检查到这个信号。

  检查到信号后,系统就会让进程执行相应的动作。

Linux通信所使用信号可由命令man 7 signal来查询。

例如:

#include <signal.h>
#include <stdio.h>
static void sig_func(int);
main()
{
          if(signal(SIGINT,sig_func)==SIG_ERR)
                    perror("Can't Catch SIGINT");
          for(;;);
}
static void sig_func(int signo)
{
           printf("Rcvd sig %d\n",signo);
}

与信号相关的系统调用

posted @ 2012-03-28 01:04  龍傲霜  阅读(328)  评论(0编辑  收藏  举报