首页 运维 网络学院 查看内容

Linux的信号机制

2014-11-22 20:32 614 0

摘要: 信号分类 不可靠信号 VS. 可靠信号  Linux信号机制基本上是从UNIX系统中继承过来的。早期UNIX系统中的信号机制比较简单和原始,后来在实践中暴露出一...
关键词: nbsp 信号 进程 函数 实时 pid 支持 signal 机制 内核

信号分类 不可靠信号 VS. 可靠信号  Linux信号机制基本上是从UNIX系统中继承过来的。早期UNIX系统中的信号机制比较简单和原始,后来在实践中暴露出一些问题,它的主要问题是:    1.进程每次处理信号后,就将对信号的响应设置为默认动作。在某些情况下,将导致对信号的错误处理;因此,用户如果不希望这样的操作,那么就要在信号处理函数结尾再一次调用signal(),重新安装该信号。    2.早期UNIX下的不可靠信号主要指的是进程可能对信号做出错误的反应以及信号可能丢失。      Linux支持不可靠信号,但是对不可靠信号机制做了改进:在调用完信号处理函数后,不必重新调用该信号的安装函数(信号安装函数是在可靠机制上的实现)。因此,Linux下的不可靠信号问题主要指的是信号可能丢失。 可靠信号    随着时间的发展,实践证明,有必要对信号的原始机制加以改进和扩充。所以,后来出现的各种UNIX版本分别在这方面进行了研究,力图实现"可靠信号"。由于原来定义的信号已有许多应用,不好再做改动,最终只好又新增加了一些信号,并在一开始就把它们定义为可靠信号,这些信号支持排队,不会丢失。同时,信号的发送和安装也出现了新版本:信号发送函数sigqueue()及信号安装函数sigaction()。    sigaction和signal函数都是调用内核服务do_signal函数;[内核服务函数,应用系统无法调用的函数] 实时信号(可靠信号)和非实时信号(不可靠信号)    早期UNIX系统只定义了32种信号,Linux 3.x支持64种信号,编号0-63(SIGRTMIN=31,SIGRTMAX=63),将来可能进一步增加,这需要得到内核的支持。 前32种信号已经有了预定义值,每个信号有了确定的用途及含义,并且每种信号都有各自的缺省动作。如按键盘的CTRL+C时,会产生SIGINT信号,对该信号的默认反应就是进程终止。后32个信号表示实时信号,等同于可靠信号。这保证了发送的多个实时信号都被接收。实时信号是POSIX标准的一部分,可用于应用进程。    非实时信号都不支持排队,都是不可靠信号;实时信号都支持排队,都是可靠信号。 信号发送kill[cpp] view plaincopyint kill(pid_t pid, int signo);      kill既可以向自身发送信号,也可以向其他进程发送信号 signo参数组合情况解释:   pid>0 将信号sig发给pid进程   pid=0 将信号sig发给同组进程   pid=-1 将信号sig发送给所有进程,调用者进程有权限发送的每一个进程(除了1号进程之外,还有它自身)   pid<-1 将信号sig发送给进程组是pid(绝对值)的每一个进程 实验:[cpp] view plaincopyvoid onSignalAction(int signalNumber)  {      switch(signalNumber)      {      case SIGUSR1:          cout << "SIGUSR1 = " << signalNumber << endl;          break;      default:          cout << "Other Signal ..." << endl;          break;      }  }    int main()  {      if (signal(SIGUSR1,onSignalAction)== SIG_ERR)      {          perror("signal error");          return -1;      }        pid_t pid = fork();      if (pid == -1)      {          perror("fork error");          return -1;      }  
  • 声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

  • 路过

    雷人

    握手

    鲜花

    鸡蛋

    最新评论

    返回顶部