第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并挂起,直到捕捉到某个信号并从信号处理程序返回,结束挂起并恢复信号屏蔽字

原文地址:https://www.cnblogs.com/buptlyn/p/4158592.html