- 进程对信号的处理方式:
- 1、忽略;
- 2、默认;
- 3、捕捉;
- 发送信号的三种情形:
- 1、操作系统给进程发送信号;
- 2、用户给进程发送信号;
- 3、一个进程给另一个进程发送信号;
- 信号的本质:
- 1、信号是中断的一种软件模拟;
- 2、信号是基于操作系统内核实现;
- 3、而中断则是基于硬件实现;
- 信号处理函数(signal函数):
#include <signal.h>
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
- 发送信号的函数(raise函数、kill函数):
- raise函数:
#include <signal.h>
int raise(int sig);
#include <sys/types.h>
#include <signal.h>
int kill(pid_t pid, int sig);
#include <unistd.h>
unsigned int alarm(unsigned int seconds);
- 常用的信号:
- SIGHUP: 该信号在用户
终端关闭
时产生,通常是发给和该终端关联的会话内的所有的进程; - SIGINT:该信号在用户键入
INTR字符即Ctrl C
时产生,内核发送此信号送到当前终端的所有前台进程; - SIGQUIT:该信号和
SIGINT
类似,但由QUIT字符
(Ctrl \
)来产生; - SIGILL:该信号在一个进程企图执行一条
非法指令
时产生; - SIGSEV:该信号在
非法访问
内存时产生,如野指针、缓存区溢出; - SIGPIPE:当进程往一个
没有读端的管道
中写入时产生,代表管道断裂
; - SIGKILL:该信号用来
结束进程
,并且不能被捕捉和忽略; - SIGSTOP:该信号用来
暂停进程
,并且不能被捕捉和忽略; - SIGTSTP:该信号用于
暂停进程
,用户可键入SUSP字符
(Ctrl Z
)发出这个信号; - SIGCONT:该信号让进程进入
运行态
; - SIGALRM:该信号用于通知进程
定时器时间
已到; - SIGCHLD :当
子进程退出
的时候,会给父进程发送
该信号; - SIGUSR1、SIGUSR2:该信号
保留
给用户程序使用; - 注意:
- 只有
SIGKILL
和SIGSTOP
不能被忽略和捕捉;