1.信号的三种响应方式 ; 忽略, 默认响应, 自定义
2.信号相对于进程的控制流程来说是异步的。
3.使用kill -l 查看系统定义的信号列表
1-33 不支持排队 34-64支持排队
例 ; Ctrl-C产生SIGINT信号, Ctrl-产生SIGQUIT信号, Ctrl-Z产生 SIGTSTP 信号(可使前台进程停止)
4.SIGQUIT的默认处理动作是终止进程并且Core Dump
ulimit -c 1024 : 允许core文件爱女最大为1024K
5.kill命令是调用kill函数实现的。
6.kill函数的作用 ; 可以给一个指定的进程发送指定的信号
raise 函数 : 可以给当前进程发送指定的信号。
函数原型 : #include <signal.h>
int kill(pid_t pid, int signo);
int raise(int signo);
返回值 : 成功返回0,失败返回-1
signo 为那几个数的几种情况 :
0 : 杀死本组进程
-1 :杀死除init之外的所有进程
>= 1 : 杀死某个进程
-10 : 杀死组号为10的进程
7. abort函数使当前进程接受到SIGABRT信号而异常终止
函数原型: #include <stdlib.h>
void abort(void);
返回值 : 总是会成功,所以么有返回值
8.alarm()函数和SIGALRM信号
函数原型 : #include <unistd.h>
unsigned int alarm(unsigned int seconds);
调用alarm函数可以设定一个闹钟, 可以告诉内核在seconds 秒后给当前进程发SIGALRM 信号。该信号的默认处理动作是终止当前进程。
如果seconds为0,表示取消以前设定的闹钟, 函数返回值仍然是以前设定的闹钟时间还余下的秒数
9.信号递达 : 实际执行信号的处理的动作
信号未决 : 信号从产生到递达之间的状态
10 , 每个信号都有两个标志位分别表示阻塞和未决
11. 信号集操作函数 :
sigset_t 类型对于每种信号用一个bit表示“有效”或“无效”状态
函数原型 : #include <signal.h>
int sigemptyset(sigset_t *set); 清零
int sigfillset(sigset_t *set); 置1
int sigaddset(siget_t *set, int signo); 某一位置1
int sigdelset(sigset_t *set, int signo); 某一位清零
int sigismemeber(const sigset_t *set, int signo); 判断某一位是否为1
12. 调用 sigprocmask : 读取或更改进程屏蔽字
函数原型 : #include <signal.h>
int sigprocmask(int how, const sigset_t *set, sigset_t *oset);
返回值 : 成功为 0, 失败为 -1
若oset非空指针, 则读取进程的当前信号屏蔽信号通过oset参数传出
若set非空指针, 则更改进程的信号屏蔽字。
若两者都非空 , 先将原来的信号屏蔽备份到oset里, 然后根据set和how参数更改信号屏蔽字。
how :
SIG_BLOCK : set包含了我们希望添加到当前信号屏蔽字的信号
SIG_UNBLOCK : set包含了从当前信号屏蔽字着中解除阻塞的信号。
SIG_SETMASK : 设置当前信号屏蔽字位set所指向的值。
13.函数原型 : #include <signal.h>
int sigpending(sigset_t *set);
sigpending读取当前进程的未决信号集, 通过set参数传出。
成功返回0, 失败返回-1