C++ signal的使用

1、头文件

  #include  <signal.h>

2、功能

  设置某一信号的对应动作

3、函数原型

  typdef  void  (*sighandler_t )(int);

  sighandler_t  signal(int  signum,  sighandle_t handler);

  第一个参数是目标信号;

  第二个参数是一个函数指针,指向某个处理该信号的函数。这个处理函数带有一个int型参数,并返回值为void

  信号处理函数的参数可以为:

     SIG_IGN:如果func参数被设置为SIG_IGN,该信号将被忽略;

      SIG_DFL:如果func参数被设置为SIG_DFL,该信号会按照确定行为处理;

4. signum信号的可能类型
  1) #define SIGHUP 1   /* hangup */

    SIGHUP是Unix系统管理员很常用的一个信号。许多后台服务进程在接受到该信号后将会重新读取它们的配置文件。然而,该信号的实际功能是通知进程它的控制终端被断开。缺省行为是终止进程。

  2) #define SIGINT 2 /* interrupt */
   对于Unix使用者来说,SIGINT是另外一个常用的信号。许多shell的CTRL-C组合使得这个信号被大家所熟知。该信号的正式名字是中断信号。缺省行为是终止进程。 

3) #define SIGQUIT 3 /* quit */

 

   SIGQUIT信号被用于接收shell的CTRL-/组合。另外,它还用于告知进程退出。这是一个常用信号,用来通知应用程序从容的(译注:即在结束前执行一些退出动作)关闭。缺省行为是终止进程,并且创建一个核心转储。

4) #define SIGILL 4 /* illegal instr. (not reset when caught) */
   如果正在执行的进程中包含非法指令,操作系统将向该进程发送SIGILL信号。如果你的程序使用了线程,或者pointer
functions,那么可能的话可以尝试捕获该信号来协助调试。([color=Red]注意:原文这句为:“If your program
makes use of use of threads, or pointer functions, try to catch this
signal if possible for aid in debugging.”。中间的两个use of use
of,不知是原书排版的瑕疵还是我确实没有明白其意义;另外,偶经常听说functions pointer,对于pointer
functions,google了一下,应该是fortran里面的东西,不管怎样,还真不知道,确切含义还请知道的兄弟斧正。[/color])缺省
行为是终止进程,并且创建一个核心转储。

5) #define SIGTRAP 5 /* trace trap (not reset when caught) */
   SIGTRAP这个信号是由POSIX标准定义的,用于调试目的。当被调试进程接收到该信号时,就意味着它到达了某一个调试断点。一旦这个信号被交付,被调试的进程就会停止,并且它的父进程将接到通知。缺省行为是终止进程,并且创建一个核心转储。

6) #define SIGABRT 6 /* abort() */
   SIGABRT提供了一种在异常终止(abort)一个进程的同时创建一个核心转储的方法。然而如果该信号被捕获,并且信号处理句柄没有返回,那么进程不会终止。缺省行为是终止进程,并且创建一个核心转储。

7) #define SIGFPE 8 /* floating point exception */
   当进程发生一个浮点错误时,SIGFPE信号被发送给该进程。对于那些处理复杂数学运算的程序,一般会建议你捕获该信号。缺省行为是终止进程,并且创建一个核心转储。

8) #define SIGKILL 9 /* kill (cannot be caught or ignored) */
 
 SIGKILL是这些信号中最难对付的一个。正如你在它旁边的注释中看到的那样,这个信号不能被捕获或忽略。一旦该信号被交付给一个进程,那么这个进程
就会终止。然而,会有一些极少数情况SIGKILL不会终止进程。这些罕见的情形在处理一个“非中断操作”(比如磁盘I/O)的时候发生。虽然这样的情形
极少发生,然而一旦发生的话,会造成进程死锁。唯一结束进程的办法就只有重新启动了。缺省行为是终止进程。

9) #define SIGBUS 10 /* bus error */
   如同它的名字暗示的那样,CPU检测到数据总线上的错误时将产生SIGBUS信号。当程序尝试去访问一个没有正确对齐的内存地址时就会产生该信号。缺省行为是终止进程,并且创建一个核心转储。

10) #define SIGSEGV 11 /* segmentation violation */
 
 SIGSEGV是另一个C/C++程序员很熟悉的信号。当程序没有权利访问一个受保护的内存地址时,或者访问无效的虚拟内存地址(脏指针,dirty
pointers,译注:由于没有和后备存储器中内容进行同步而造成。关于野指针,可以参见http://en.wikipedia.org/wiki
/Wild_pointer 的解释。)时,会产生这个信号。缺省行为是终止进程,并且创建一个核心转储。

11) #define SIGSYS 12 /* non-existent system call invoked */
   SIGSYS信号会在进程执行一个不存在的系统调用时被交付。操作系统会交付该信号,并且进程会被终止。缺省行为是终止进程,并且创建一个核心转储。

12) #define SIGPIPE 13 /* write on a pipe with no one to read it */
   管道的作用就像电话一样,允许进程之间的通信。如果进程尝试对管道执行写操作,然而管道的另一边却没有回应者时,操作系统会将SIGPIPE信号交付给这个讨厌的进程(这里就是那个打算写入的进程)。缺省行为是终止进程。

13) #define SIGALRM 14 /* alarm clock */
   在进程的计时器到期的时候,SIGALRM信号会被交付(delivered)给进程。这些计时器由本章后面将会提及
的setitimer和alarm调用设置。缺省行为是终止进程。

14) #define SIGTERM 15 /* software termination signal from kill */
   SIGTERM信号被发送给进程,通知该进程是时候终止了,并且在终止之前做一些清理活动。SIGTERM信号是Unix的kill命令发送的缺省信号,同时也是操作系统关闭时向进程发送的缺省信号。缺省行为是终止进程。

15) #define SIGURG 16 /* urgent condition on IO channel */
   在进程已打开的套接字上发生某些情况时,SIGURG将被发送给该进程。如果进程不捕获这个信号的话,那么将被丢弃。缺省行为是丢弃这个信号。

16) #define SIGSTOP 17 /* sendable stop signal not from tty */
   本信号不能被捕获或忽略。一旦进程接收到SIGSTOP信号,它会立即停止(stop),直到接收到另一个SIGCONT
信号为止。缺省行为是停止进程,直到接收到一个SIGCONT信号为止。

17) #define SIGTSTP 18 /* stop signal from tty */
   SIGSTP与SIGSTOP类似,它们的区别在于SIGSTP信号可以被捕获或忽略。当shell从键盘接收到CTRL-Z的时候就会交付(deliver)这个信号给进程。缺省行为是停止进程,直到接收到一个SIGCONT信号为止。

18) #define SIGCONT 19 /* continue a stopped process */
 
 SIGCONT也是一个有意思的信号。如前所述,当进程停止的时候,这个信号用来告诉进程恢复运行。该信号的有趣的地方在于:它不能被忽略或阻塞,但可
以被捕获。这样做很有意义:因为进程大概不愿意忽略或阻塞SIGCONT信号,否则,如果进程接收到SIGSTOP或SIGSTP的时候该怎么办?缺省行
为是丢弃该信号。

19) #define SIGCHLD 20 /* to parent on child stop or exit */
   SIGCHLD是由Berkeley Unix引入的,并且比SRV 4
Unix上的实现有更好的接口。(如果信号是一个没有追溯能力的过程(not a retroactive
process),那么BSD的SIGCHID信号实现会比较好。在system V
Unix的实现中,如果进程要求捕获该信号,操作系统会检查是否存在有任何未完成的子进程(这些子进程是已经退出exit)的子进程,并且在等待调用
wait的父进程收集它们的状态)。如果子进程退出的时候附带有一些终止信息(terminating
information),那么信号处理句柄就会被调用。所以,仅仅要求捕获这个信号会导致信号处理句柄被调用(译注:即是上面说的“信号的追溯能
力”),而这是却一种相当混乱的状况。)一旦一个进程的子进程状态发生改变,SIGCHLD信号就会被发送给该进程。就像我在前面章节提到的,父进程虽然
可以fork出子进程,但没有必要等待子进程退出。一般来说这是不太好的,因为这样的话,一旦进程退出就可能会变成一个僵尸进程。可是如果父进程捕获
SIGCHLD信号的话,它就可以使用wait系列调用中的某一个去收集子进程状态,或者判断发生了什么事情。当发送SIGSTOP,SIGSTP或
SIGCONF信号给子进程时,SIGCHLD信号也会被发送给父进程。缺省行为是丢弃该信号。

20) #define SIGTTIN 21 /* to readers pgrp upon background tty read */
   当一个后台进程尝试进行一个读操作时,SIGTTIN信号被发送给该进程。进程将会阻塞直到接收到SIGCONT信号为止。缺省行为是停止进程,直到接收到SIGCONT信号。

21) #define SIGTTOU 22 /* like TTIN if (tp->t_local&LTOSTOP) */
 
 SIGTTOU信号与SIGTTIN很相似,不同之处在于SIGTTOU信号是由于后台进程尝试对一个设置了TOSTOP属性的tty执行写操作时才会
产生。然而,如果tty没有设置这个属性,SIGTTOU就不会被发送。缺省行为是停止进程,直到接收到SIGCONT信号。

22) #define SIGIO 23 /* input/output possible signal */
   如果进程在一个文件描述符上有I/O操作的话,SIGIO信号将被发送给这个进程。进程可以通过fcntl调用来设置。缺省行为是丢弃该信号。

23) #define SIGXCPU 24 /* exceeded CPU time limit */
   如果一旦进程超出了它可以使用的CPU限制(CPU limit),SIGXCPU信号就被发送给它。这个限制可以使用随后讨论的setrlimit设置。缺省行为是终止进程。

24) #define SIGXFSZ 25 /* exceeded file size limit */
   如果一旦进程超出了它可以使用的文件大小限制,SIGXFSZ信号就被发送给它。稍后我们会继续讨论这个信号。缺省行为是终止进程。

25) #define SIGVTALRM 26 /* virtual time alarm */
   如果一旦进程超过了它设定的虚拟计时器计数时,SIGVTALRM信号就被发送给它。缺省行为是终止进程。

26) #define SIGPROF 27 /* profiling time alarm */
   当设置了计时器时,SIGPROF是另一个将会发送给进程的信号。缺省行为是终止进程。

27) #define SIGWINCH 28 /* window size changes */
   当进程调整了终端的行或列时(比如增大你的xterm的尺寸),SIGWINCH信号被发送给该进程。缺省行为是丢弃该信号。

28) #define SIGUSR1 29 /* user defined signal 1 */
29) #define SIGUSR2 30 /* user defined signal 2 */

   SIGUSR1和SIGUSR2这两个信号被设计为用户指定。它们可以被设定来完成你的任何需要。换句话说,操作系统没有任何行为与这两个信号关联。缺省行为是终止进程。(译注:按原文的意思翻译出来似乎这两句话有点矛盾。)

5. 例子
   5.1. Linux下的Ctrl+C在Windows下的实现一

   Linux下通常的做法:
   signal(SIGINT, sigfunc); // 设置信号
   void sigfunc(int signo)
   {
      ... //处理信号相关的操作
   }

   以下是Linux下的Ctrl+C在Windows下的实现
   #include <stdio.h>
   #include <windows.h>
   static is_loop = 1;
   // 捕获控制台 Ctrl+C 事件的函数
   BOOL CtrlHandler( DWORD fdwCtrlType )
   {
      switch (fdwCtrlType)
      {
      /* Handle the CTRL-C signal. */
      case CTRL_C_EVENT:
         printf("CTRL_C_EVENT \n");
         break;
      case CTRL_CLOSE_EVENT:
         printf("CTRL_CLOSE_EVENT \n");
         break;
      case CTRL_BREAK_EVENT:
         printf("CTRL_BREAK_EVENT \n");
         break;
      case CTRL_LOGOFF_EVENT:
         printf("CTRL_LOGOFF_EVENT \n");
         break;
      case CTRL_SHUTDOWN_EVENT:
         printf("CTRL_SHUTDOWN_EVENT \n");
         break;
      default:
         return FALSE;
      }
      is_loop = 0;
      return (TRUE);
   }

   int main(int argc, char *argv[])
   {
      printf("Set Console Ctrl Handler\n");
      SetConsoleCtrlHandler((PHANDLER_ROUTINE)CtrlHandler, TRUE);
      while (is_loop);
      return 0;
   }

   5.2.Linux下的Ctrl+C在Windows下的实现二
   #include <stdio.h>
   #include <windows.h>
   #define CONTRL_C_HANDLE() signal(3, exit)
   int main(int argc, char *argv[])
   {
      printf("Set Console Ctrl Handler\n");
      CONTRL_C_HANDLE();
      while (1);
      system("PAUSE");
      return 0;
   }

 

 

 

时间: 2024-08-31 14:06:11

C++ signal的使用的相关文章

C标准库&lt;signal.h&gt;实现

背景知识 signal.h是C标准函数库中的信号处理部分, 定义了程序执行时如何处理不同的信号.信号用作进程间通信, 报告异常行为(如除零).用户的一些按键组合(如同时按下Ctrl与C键,产生信号SIGINT).信号是程序执行过程中发生的异常事件,同步信号的产生 是因为程序自身的某些动作,例如除零或不正当的访问存储器,异步信号是由程序外部的行为引起的,比如有人敲击了提示键或者另外一个程序(异步地执行)给你 的程序发信号,都会引发一个异步信号.程序不能屏蔽的信号要求立即得到处理.如果不对发生的信号

Zend Signal in PHP 5.4

  在PHP5.4中, 根据由Rasmus提交的RFC, 引入了一套新的信号处理机制, 目的是为了使得信号屏蔽机制可以应用到任何SAPI中, 并且提高在这个过程中的PHP性能. 新的机制, 叫做zend signal, 它的理念, 来自Yahoo的"延迟信号处理"(Yahoo signal deferring mechanism), 而后, facebook把这套理念加入了PHP中, 为了提升PHP+Apache 1.X下PHP调用ap_block/ap_unblock的性能. 在详细

C标准库参考指南(9)signal.h

9. signal.h 头文件signal处理程序运行时产生的信号的方法. 宏: SIG_DFL SIG_ERR SIG_IGN SIGABRT SIGFPE SIGILL SIGINT SIGSEGV SIGTERM 函数: signal(); raise(); 变量: typedef sig_atomic_t 9.1. 变量和定义 类型sig_atomic_t就是int,作为signal函数的handler中的变量.SIG_宏用于signal函数中用于定义信号函数. SIG_DFL   默认

Linux下C编程:signal和sigaction

要对一个信号进行处理,就需要给出此信号发生时系统所调用的处理函数.可以对一个特定的信号(除去SIGKILL和SIGSTOP信号)注册相应的处理函数.注册某个信号的处理函数后,当进程接收到此信号时,无论进程处于何种状态,就会停下当前的任务去执行此信号的处理函数. 1.注册信号函数. #include<signal.h> void(*signal(int signumber,void ((*func)(int))(int) signumber表示信号处理函数对应的信号.func是一个函数指针.此函

Linux进程间通信(五) 信号通信之signal()、信号集函数组及其基础实验

上一节介绍进程间通信方式之一信号通信中的信号产生和捕捉函数,这一节介绍信号处理函数signal()函 数和信号集函数组,接上一节http://blog.csdn.net/mybelief321/article/details/9078193 强烈建 议做最后一个实验! 信号处理方法 信号处理的方法主要有以下两种: ①  使用 signal() 函数: ②  使用信号集函数组. 使用signal()函数 函数说明 使 用signal()函数处理时,只需指出要处理的信号和处理函数即可.它主要用于前3

linux下signal()函数详解

首先说明函数指针的定义形式: <存储类型> 数据类型 (* 函数指针名) (参数表): 其中存储类型一般不写,用默认形式.可以选auto型.static型和extern型等.数据类型是指针所指向函数返回值的数据类型.参数表是指向函数的参数表. 再说明一个函数的返回值是一个函数指针(可理解为此函数A实际返回的是一个指向另一个函数B的指针)的定义形式: <存储类型> 数据类型 (* 函数名(参数表1))(参数表2): 表头文件 #include<signal.h> 功 能:

perl中使用signal(信号)实例

  这篇文章主要介绍了perl中使用signal(信号)实例,本文讲解了信号的相关知识以,并给出了perl代码实例,需要的朋友可以参考下 使用signal,能让你的程序功能更丰富.要在Linux下列出所有的signal, 利用kill -l即可. 下面是我机器上的输出(后面还有到64的没列出来): 代码如下: xuyang@xuyang-desktop:/$ kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABR

Linux 信号signal处理机制

  信号是Linux编程中非常重要的部分,本文将详细介绍信号机制的基本概念.Linux对信号机制的大致实现方法.如何使用信号,以及有关信号的几个系统调用.  信号机制是进程之间相互传递消息的一种方法,信号全称为软中断信号,也有人称作软中断.从它的命名可以看出,它的实质和使用很象中断.所以,信号可以说是进程控制的一部分.  一.信号的基本概念  本节先介绍信号的一些基本概念,然后给出一些基本的信号类型和信号对应的事件.基本概念对于理解和使用信号,对于理解信号机制都特别重要.下面就来看看什么是信号.

Linux信号(signal) 机制分析(1)

[摘要]本文分析了Linux内核对于信号的实现机制和应用层的相关处理.首先介绍了软中断信号的本质及信号的两种不同分类方法尤其是不可靠信号的原理.接着分析了内核对于信号的处理流程包括信号的触发/注册/执行及注销等.最后介绍了应用层的相关处理,主要包括信号处理函数的安装.信号的发送.屏蔽阻塞等,最后给了几个简单的应用实例. [关键字]软中断信号,signal,sigaction,kill,sigqueue,settimer,sigmask,sigprocmask,sigset_t 1. 信号本质 软

ndk jni c++ android-Android上利用JNI调用OpenCV函数时出现Fatal signal 11错误

问题描述 Android上利用JNI调用OpenCV函数时出现Fatal signal 11错误 我想在Android上用OpenCV实现人脸识别功能,即事先有一个我提供的人脸训练库,然后检测出人脸后,识别他和训练库中的哪类人最像. 我已在windows平台实现了该功能,并将训练好的FaceRecognizer通过save的方式存储成了xml.我将xml文件放入了Android手机某目录下,然后想利用JNI的方式在Android app中使用OpenCV载入该数据库,但运行到这一行就会报错: F