C和指针 第十六章 标准函数库 信号

时间:2022-06-25 01:05:31

信号名<signal.h>

程序中大多数错误都是程序本身导致的,但是,有些程序遇到的事件却不是程序本身所引发的。比如用户终止程序,程序无法预知此类事件发生的情况,信号就是为了对此类事件做出反应的。信号是一种事件,它可能异步发生。如果没有安排怎么处理一个特定的信号,那么该信号出现时,程序就做出一个缺省反应,大部分编译器都是终止程序。

POSIX.1中列出的信号:

信号 值 处理动作 发出信号的原因
----------------------------------------------------------------------
SIGHUP 1 A 终端挂起或者控制进程终止
SIGINT 2 A 键盘中断(如break键被按下)
SIGQU99v 3 C 键盘的退出键被按下
SIGILL 4 C 非法指令
SIGABRT 6 C 由abort(3)发出的退出指令
SIGFPE 8 C 浮点异常
SIGKILL 9 AEF Kill信号
SIGSEGV 11 C 无效的内存引用
SIGPIPE 13 A 管道破裂: 写一个没有读端口的管道
SIGALRM 14 A 由alarm(2)发出的信号
SIGTERM 15 A 终止信号
SIGUSR1 30,10,16 A 用户自定义信号1
SIGUSR2 31,12,17 A 用户自定义信号2
SIGCHLD 20,17,18 B 子进程结束信号
SIGCONT 19,18,25 进程继续(曾被停止的进程)
SIGSTOP 17,19,23 DEF 终止进程
SIGTSTP 18,20,24 D 控制终端(tty)上按下停止键
SIGTTIN 21,21,26 D 后台进程企图从控制终端读
SIGTTOU 22,22,27 D 后台进程企图从控制终端写
SIGINT和SIGTERM是异步发生的,它们在程序外部发生,通常时用户向程序传达一些信息。
信号处理
int raise(in sig);
raise函数用于显示触发一个信号
当信号发生时,可以有三种方式对他反应,缺省的时编译器定义的,终止程序,程序可以指定信号被忽略或者指定处理函数。
void (*signal(int sig, void(*haddler)(int)))(int);

把这段声明分开看:

void (*signal())(int)

signal是一个函数,返回值是一个指向参数为int,无返回值的指针

signal(int sig, void(*haddler)(int))

signal的参数是一个信号量,和一个处理函数。signal函数返回的函数指针,是指向之前的信号处理函数的指针,可以保存这个值,然后为信号设置处理函数,并可以在将来恢复之前的处理函数。

在调用中,参数signum指出要设置处理方法的信号。第二个参数handler是一个处理函数,或者是
SIG_IGN:忽略参数signum所指的信号。
SIG_DFL:恢复参数signum所指信号的处理方法为默认值。

#include <stdio.h>
#include <signal.h>
#include <zconf.h> void handler(int sig)
{
switch(sig){
case SIGHUP:
printf("get signal SIGHUP\n");
break;
case SIGINT:
printf("get signal SIGINT\n");
break;
case SIGTERM:
printf("get signal SIGTERM \n");
break;
default:
break;
}
} int main()
{
printf("process id is %d ",getpid());
signal(SIGHUP, handler);
signal(SIGINT, handler);
signal(SIGTERM, handler);
raise(SIGTERM);
for(;;);
return 1;
}

运行:

C和指针 第十六章 标准函数库 信号

注意,每次型号发生时,需要重新设置信号处理函数。