singal()函数
- typedef void (*sighandler_t)(int);
- sighandler_t signal(int signum, sighandler_t handler);
- signal函数
- 作用1:站在应用程序的角度,注册一个信号处理函数
- 作用2:忽略信号,设置信号默认处理 信号的安装和回复
- 参数
- --signal是一个带signum和handler两个参数的函数,准备捕捉或屏蔽的信号由参数signum给出,接收到指定信号时将要调用的函数有handler给出
- --handler这个函数必须有一个int类型的参数(即接收到的信号代码),它本身的类型是void
- --handler也可以是下面两个特殊值:① SIG_IGN 屏蔽该信号 ② SIG_DFL 恢复默认行为
Linux终端下信号列表
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专用,进程超过资源限制的时候发送
自定义信号的使用
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
static void sig_usr(int signo)
{
if (signo == SIGUSR1)
{
printf("received SIGUSR1!\n");
}
else if (signo == SIGUSR2)
{
printf("receive SIGUSR2!\n");
}
}
int main()
{
/*******************不明白在这里参数signo是怎么传到sig_usr中******************/
if (signal(SIGUSR1, sig_usr) == SIG_ERR)
{
printf("signal1 error!\n");
}
if (signal(SIGUSR1, sig_usr) == SIG_ERR)
{
printf("signal2 error!\n");
}
for (;;)
{
pause();
}
return 0;
}
Linux终端下运行结果:
[root@localhost work1]# gcc 1.c -o 1
[root@localhost work1]# ./1 &
[1] 10826
[root@localhost work1]# kill -USR1 10826
[root@localhost work1]# received SIGUSR1!
kill -USR2 10826
[root@localhost work1]#
[1]+ 用户定义信号 2 ./1
[root@localhost work1]#