第10章信号总结
1 常见的信号
不能被捕捉或忽略的信号:SIGKILL、SIGSTOP 杀死和停止一个进程的可靠方法
SIGCHLD:进程终止或停止时,SIGCHLD信号发送给其父进程,系统默认忽略此信号
SIGCONT:发送给处于停止状态需要继续运行的进程
SIGHUP:终端接口断开连接时,此信号发送给该终端相关的控制进程(会话首进程)
SIGINT:中断进程信号
SIGQUIT:退出键
SIGIO:指示异步I/O事件
SIGPIPE:写已经读关闭的管道时产生此信号
SIGPOLL:在一个可轮询设备上发生特定事件时产生此信号
SIGTTIN:后台进程组试图读控制终端时产生此信号
SIGTTOU:后台进程组试图写控制终端时产生此信号(可以选择允许后台进程组写控制终端,这种情况下不会产生此信号)
2 signal函数
void (*signal(int signo,void (*func)(int)))(int)
设置信号signo的处理函数,这种设置会被子进程继承,但是exec会破坏这种继承(因为进程空间都被替换了)
func常量值:SIG_IGN,SIG_DFL,表示忽略与默认
3 几个函数
#include <signal.h> int kill(pid_t pid,int signo) int raise(int signo)
kill函数中,pid>0发送给特定进程pid,pid=0发送给同一进程组所有进程,pid<-1发送给进程组|pid|中所有进程,pid=-1发送给所有有权发送的进程
#include <unistd.h> unsigned int alarm(unsigned int seconds) int pause()
3 信号集sigset_t
#include <signal.h> int sigemptyset(sigset_t *set) int sigfillset(sigset_t *set) int sigaddset(sigset_t *set,int signo) int sigdelset(sigset_t *set,int signo) int sigismember(sigset_t *set,int signo) int sigprocmask(int how,const sigset_t *set,sigset_t *oset)
sigprocmask用来设置和查看当前进程的信号屏蔽字(通过set设置,通过oset返回原来的信号屏蔽字)
how控制设置方式:SIG_BLOCK:将set中的信号加入当前信号屏蔽字
SIG_UNBLOCK:将set中的信号从当前信号屏蔽字中删除
SIG_SETMASK:进程的信号屏蔽字替换为set
int sigpending(sigset_t *set)
sigpending函数通过set返回产生了但是被当前进程阻塞的进程
int sigaction(int signo,struct sigaction *act,struct sigaction *oact) struct sigaction { void (*sa_handler)(int); sigset_t sa_mask; int sa_flags; void (*sa_sigaction)(int,siginfo_t *,void *); };
sigaction函数比signal函数提供了关于某一信号的更多的设置(处理信号处理函数外)
sa_handler是信号处理函数指针
sa_mask是信号屏蔽字(执行该信号处理函数时,添加到信号屏蔽字中的信号,执行完信号处理函数后再回复信号屏蔽字)
sa_flags一些处理选项
sa_sigaction是替代信号处理函数指针,sa_flags中制定了某些选项后将以sa_sigaction指向的函数作为信号处理函数
#include <setjmp.h> int sigsetjmp(sigjmp_buf env,int savemask) int siglongjmp(sigjmp_buf env,int val)
sigsetjmp比setjmp函数增加了savemask标志,指明是否保存当前的信号屏蔽字
int sigsuspend(const sigset_t *sigmask)
将进程的信号屏蔽字设置为sigmask并挂起,直到捕捉到某个信号并从信号处理程序返回,结束挂起并恢复信号屏蔽字