signal

sig是传递给它的唯一参数。执行了signal()调用后,进程只要接收到类型为sig的信号,不管其正在执行程序的哪一部分,就立即执行func()函数。当func()函数执行结束后,控制权返回进程被中断的那一点继续执行。

表头文件#include<signal.h>
功 能:设置某一信号的对应动作
函数原型:void (*signal(int signum,void(* handler)(int)))(int);
或者:typedef void (*sig_t)( int );
sig_t signal(int signum,sig_t handler);
参数说明
第一个参数signum指明了所要处理的信号类型,它可以取除了SIGKILL和SIGSTOP外的任何一种信号。
第二个参数handler描述了与信号关联的动作,它可以取以下三种值:
(1)一个无返回值的函数地址
此函数必须在signal()被调用前申明,handler中为这个函数的名字。当接收到一个类型为signum的信号时,就执行handler 所指定的函数。这个函数应有如下形式的定义:
void func(int sig);
(2)SIG_IGN
这个符号表示忽略该信号,执行了相应的signal()调用后,进程会忽略类型为sig的信号。
(3)SIG_DFL
这个符号表示恢复系统对信号的默认处理。
函数说明
signal()会依参数signum 指定的信号编号来设置该信号的处理函数。当指定的信号到达时就会跳转到参数handler指定的函数执行。当一个信号的信号处理函数执行时,如果进程又接收到了该信号,该信号会自动被储存而不会中断信号处理函数的执行,直到信号处理函数执行完毕再重新调用相应的处理函数。但是如果在信号处理函数执行时进程收到了其它类型的信号,该函数的执行就会被中断。
返回值:返回先前的信号处理 函数指针,如果有错误则返回SIG_ERR(-1)。
下面的情况可以产生Signal:
  1. 按下CTRL+C产生SIGINT
  2. 硬件中断,如除0,非法内存访问(SIGSEV)等等
  3. Kill函数可以对进程发送Signal
  4. Kill命令。实际上是对Kill函数的一个包装
  5. 软件中断。如当Alarm Clock超时(SIGURG),当Reader中止之后又向管道写数据(SIGPIPE),等等
Signal
Description
SIGABRT
由调用abort函数产生,进程非正常退出
SIGALRM
用alarm函数设置的timer超时或setitimer函数设置的interval timer超时
SIGBUS
某种特定的硬件异常,通常由内存访问引起
SIGCANCEL
由Solaris Thread Library内部使用,通常不会使用
SIGCHLD
进程Terminate或Stop的时候,SIGCHLD会发送给它的父进程。缺省情况下该Signal会被忽略
SIGCONT
当被stop的进程恢复运行的时候,自动发送
SIGEMT
和实现相关的硬件异常
SIGFPE
数学相关的异常,如被0除,浮点溢出,等等
SIGFREEZE
Solaris专用,Hiberate或者Suspended时候发送
SIGHUP
发送给具有Terminal的Controlling Process,当terminal被disconnect时候发送
SIGILL
非法指令异常
SIGINFO
BSD signal。由Status Key产生,通常是CTRL+T。发送给所有Foreground Group的进程
SIGINT
由Interrupt Key产生,通常是CTRL+C或者DELETE。发送给所有ForeGround Group的进程
SIGIO
异步IO事件
SIGIOT
实现相关的硬件异常,一般对应SIGABRT
SIGKILL
无法处理和忽略。中止某个进程
SIGLWP
由Solaris Thread Libray内部使用
SIGPIPE
在reader中止之后写Pipe的时候发送
SIGPOLL
当某个事件发送给Pollable Device的时候发送
SIGPROF
Setitimer指定的Profiling Interval Timer所产生
SIGPWR
和系统相关。和UPS相关。
SIGQUIT
输入Quit Key的时候(CTRL+\)发送给所有Foreground Group的进程
SIGSEGV
非法内存访问
SIGSTKFLT
Linux专用,数学协处理器的栈异常
SIGSTOP
中止进程。无法处理和忽略。
SIGSYS
非法系统调用
SIGTERM
请求中止进程,kill命令缺省发送
SIGTHAW
Solaris专用,从Suspend恢复时候发送
SIGTRAP
实现相关的硬件异常。一般是调试异常
SIGTSTP
Suspend Key,一般是Ctrl+Z。发送给所有Foreground Group的进程
SIGTTIN
当Background Group的进程尝试读取Terminal的时候发送
SIGTTOU
当Background Group的进程尝试写Terminal的时候发送
SIGURG
当out-of-band data接收的时候可能发送
SIGUSR1
用户自定义signal 1
SIGUSR2
用户自定义signal 2
SIGVTALRM
setitimer函数设置的Virtual Interval Timer超时的时候
SIGWAITING
Solaris Thread Library内部实现专用
SIGWINCH
当Terminal的窗口大小改变的时候,发送给Foreground Group的所有进程
SIGXCPU
当CPU时间限制超时的时候
SIGXFSZ
进程超过文件大小限制
SIGXRES
Solaris专用,进程超过资源限制的时候发送


### SIGNAL语句的用法与语法 在SQL中,`SIGNAL`语句用于在存储过程、函数、触发器或事件中向调用者返回错误或警告条件。它提供了对返回值(如错误代码和消息)的精细控制。以下是其详细的语法和使用方法: #### 1. 基本语法 `SIGNAL`语句的基本语法如下: ```sql SIGNAL SQLSTATE 'value' SET MESSAGE_TEXT = 'message', MYSQL_ERRNO = error_code; ``` - `SQLSTATE 'value'`: 必须指定一个有效的SQLSTATE值,该值是一个五字符的字符串,表示特定的错误或警告条件[^1]。 - `MESSAGE_TEXT = 'message'`: 可选参数,用于定义错误消息的内容。 - `MYSQL_ERRNO = error_code`: 可选参数,用于定义错误编号。 #### 2. 示例代码 以下是一个简单的示例,展示如何在存储过程中使用`SIGNAL`语句抛出错误: ```sql DELIMITER $$ CREATE PROCEDURE example_procedure(IN input_value INT) BEGIN IF input_value < 0 THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Input value cannot be negative', MYSQL_ERRNO = 1643; -- 自定义错误编号 END IF; -- 其他逻辑 SELECT 'Value is valid'; END$$ DELIMITER ; ``` 在这个例子中,如果输入值为负数,则会触发一个用户定义的错误,停止执行并返回错误信息[^3]。 #### 3. 注意事项 - `SIGNAL`语句必须包含`SQLSTATE`值,这是强制性的[^2]。 - `RESIGNAL`语句与`SIGNAL`类似,但只能在错误或警告处理程序中使用。如果尝试在非处理程序上下文中使用`RESIGNAL`,则会收到错误消息:`RESIGNAL when handler is not active`[^2]。 - 在触发器中,可以结合`SIGNAL`语句实现条件检查。例如,当插入数据不满足某些条件时,可以通过`SIGNAL`语句阻止操作并返回自定义错误消息[^3]。 #### 4. 使用场景 - **存储过程中的错误处理**:通过`SIGNAL`语句,开发者可以在存储过程中主动抛出错误,从而中断执行流程并通知调用者。 - **触发器中的条件验证**:在触发器中,`SIGNAL`语句可用于验证插入或更新的数据是否符合特定规则。如果不满足条件,可以阻止操作并返回错误信息。 - **统一错误管理**:通过自定义`SQLSTATE`值和错误消息,可以实现跨数据库的一致性错误管理[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值