1. 信号简介
(1)每个线程都有自己的信号屏蔽字。
(2)每个线程都对同一信号都共享一个信号处理函数。
(3)当一个线程调用pthread_create() 创建新的线程时,此线程的信号屏蔽字会被新创建的线程继承。
(4)总之:一个信号可以被没屏蔽它的任何一个线程处理,但是在一个进程内只有一个多个线程共用的处理函数
(5)当收到某个信号,启动信号处理函数时,通常会屏蔽对该信号,直到信号处理函数执行结束。(系统自动处理,程序员无需干预)
(6) 单纯的fork会导致 子进程和父进程有相同的信号处理方式。
(7)单线程中可使用 sigprocmask设置信号屏蔽字;(sigprocmask的行为在多线程的进程中没有定义)
多线程中每个线程必须使用pthread_sigmask设置本线程的信号屏蔽字。
2. 信号相关函数和数据结构
1. struct sigaction结构体 struct sigaction { void (*sa_handler)(int); //早期的捕捉函数 void (*sa_sigaction)(int, siginfo_t *, void *); //新添加的捕捉函数,所以自实现的信号处理函数必须也是这几个参数 sigset_t sa_mask; /*阻塞关键字的信号集,可以在调用捕捉函数之前,把信号(包括自身信号)添加到信号阻塞字,信号捕捉函数返回之前恢复为原先的值。防止在执行处理函数时被自己后指定信号打断。*/。 int sa_flags; //sa_flags为0表示使用sa_handler; sa_flags表示使用sa_sigaction void (*sa_restorer)(void); //弃用 }
2. 设置信号的函数(2个) //signum: 要捕捉的信号
//act: 指定新的信号处理方式
//oldact: 用于保存先前信号的处理方式,一般设置为NULL
//成功则返回0,若出错则返回-1 int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact); //推荐用这个
sighandler_t signal(int signum,sighandler_t handler); //不推荐使用
标签:实战,功能,函数,int,线程,信号,sa,sigaction From: https://www.cnblogs.com/dkhlaojogo/p/16989417.html