信号是软件中断。很多比较重要的应用程序都需要处理信号。信号提供了一种处理异步事件的方法。每个信号都有一个名字,并且他们的名字都是以SIG开头的。
信号的处理或相关动作有三种处理方式:
1、默认信号(SIG_DFL)
2、忽略信号(SIG_IGN):大多数信号可采用,除SIGKILL和SIGSTOP外。
3、自定义信号(function):自定义信号是将原来的信号被用户通过一个自定义函数修改为用户想要执行某种功能的信号。
信号的使用一般通过一个signal函数来实现。它的原型为:
void (*signal(int signo, void (*func)(int)))(int);
若调用成功则返回信号以前的处理配置,若出错则返回SIG_ERR。
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<assert.h>
#include<fcntl.h>
#include<sys/types.h>
#include<signal.h>
int count = 0;
void fun(int sign)
{
count++;
if(3 == count)
{
//exit(0);
signal(SIGINT,SIG_DFL);
}
printf("hello world!\n");
}
void main()
{
signal(SIGINT,fun);
int i = 0;
for(; i < 10; i++)
{
sleep(1);
}
}
此段代码的功能为前三次按Ctrl+c每次都会打印一个“hello world!”,第四次再按则进程就结束了(Ctrl+c 为终止信号相当于SIGINT)。起实质就是将终止信号改变为一个打印功能,当满足一定条件后再将其改回来终止进程。
SIGHUP 终止进程 终端线路挂断
SIGINT 终止进程 中断进程
SIGQUIT 建立CORE文件终止进程,并且生成core文件
SIGILL 建立CORE文件 非法指令
SIGTRAP 建立CORE文件 跟踪自陷
SIGBUS 建立CORE文件 总线错误
SIGSEGV 建立CORE文件 段非法错误
SIGFPE 建立CORE文件 浮点异常
SIGIOT 建立CORE文件 执行I/O自陷
SIGKILL 终止进程 杀死进程
SIGPIPE 终止进程 向一个没有读进程的管道写数据
SIGALARM 终止进程 计时器到时
SIGTERM 终止进程 软件终止信号
SIGSTOP 停止进程 非终端来的停止信号
SIGTSTP 停止进程 终端来的停止信号
SIGCONT 忽略信号 继续执行一个停止的进程
SIGURG 忽略信号 I/O紧急信号
SIGIO 忽略信号 描述符上可以进行I/O
SIGCHLD 忽略信号 当子进程停止或退出时通知父进程
SIGTTOU 停止进程 后台进程写终端
SIGTTIN 停止进程 后台进程读终端
SIGXGPU 终止进程 CPU时限超时
SIGXFSZ 终止进程 文件长度过长
SIGWINCH 忽略信号 窗口大小发生变化
SIGPROF 终止进程 统计分布图用计时器到时
SIGUSR1 终止进程 用户定义信号1
SIGUSR2 终止进程 用户定义信号2
SIGVTALRM 终止进程 虚拟计时器到时