第十章信号
1..信号是异步事件的经典实例.
2..信号的产生
a..进程自身-->abort
b..其他进程
c..内核
2..内核对信号的处理
a..忽略信号 SIGKILL 和 SIGSTOP不能忽略--->SIGIGN
b..捕捉信号 定义信号处理函数
c..执行默认动作 --->SIGDFL
3..signal函数
typedef void Sigfunc(int);
Sigfunc *signal(int, SIgfunc*);
4..信号的状态
a.程序启动时--->系统默认 exec函数将所有信号设置为默认动作
b..fork后的子进程,集成父进程的处理方式.
5..早期版本 信号不可靠的原因-->捕捉信号后,设为默认值 在设为默认值后,再次添加信号处理之前,有一个窗口期,
6..中断的系统调用
为了不出里 被中断的系统调用 引入系统调用的自动重启动
7..可重入函数
信号到来时,进程被打断.执行完信号处理程序后返回,继续.
例如:malloc就是不可重入的.
/***
因此,single UNIX speification说明了保证可重入的函数列表,是可供信号处理函数调用的.
但是,即使位于此表中,由于每个线程只有一个errno变量,因此也可改变其值
---->因此信号处理程序中应保存和恢复errno
**/
8..kill( getpid(), signo ); == raise(signo)
9..alarm 计时器,定时产生alarm信号.
每个进程只能有一个闹钟时钟.需要先定义处理函数,再alarm
例如:
signal(SIGALRM, sig_alarm);
alarm(1);
10..pause 使得进程挂起, int pause(void)
只有执行一个信号处理程序并返回时,pause才返回.
11..信号集--->需要一个能表示多个信号的数据类型.
12..五个处理信号集合的函数
#include <signal.h>
int sigemptyset(sigset_t *set)
int sigfillset
int sigaddset
int sigdelset
int sigismember
12..sigprocmask 测试屏蔽字/返回当前屏蔽字
SIG_BLOCK 并集
SIG_UNBLOCK 交集
SIGSETMASK 被set代替
13..sigpending 返回信号集合
sigpending()
14..sigaction()
功能:检查或修改与指定信号相关联的处理动作.
15..当调用一个信号处理程序时, 被捕捉的信号加入 当前进程的屏蔽字.
16..sigsetjmp 和siglongjmp 可以选择是否回复屏蔽字.
17..sigsuspend..在一个原子操作中西先恢复屏蔽字,然后使进程休眠.
保护临界区不被信号中断
18..abort() 使异常程序终止
19..sleep 捕捉到一个信号,并从信号处理程序返回.
第九章
1..每个进程 -- 进程ID 进程组ID
getpgrp(); == getpgid(0)
2..每个进程组都有一个组长进程
3..setpgid 加入现有组,或者创建新组
4..进程只能为他自己或者他的子进程设置进程阻ID
5..会话
一个或者多个进程组的集合
setsid(void) 建立一个新会话