一、信号集
- sigemptyset函数
#include <signal.h>
int sigemptyset(sigset_t *set);
作用:初始化set信号集(全空)
返回值:
返回0:成功
返回-1:出错
- sigfillset函数
#include <signal.h>
int sigfillset(sigset_t *set);
作用:初始化set信号集(所有信号)
返回值:
返回0:成功
返回-1:出错
- sigaddset函数
#include <signal.h>
int sigaddset(sigset_t *set, int signum);
作用:向set信号集添加signum信号
返回值:
返回0:成功
返回-1:出错
- sigdelset函数
#include <signal.h>
int sigdelset(sigset_t *set, int signum);
作用:删除set信号集中的signum信号
返回值:
返回0:成功
返回-1:出错
- sigismember函数
int sigismember(const sigset_t *set, int signum);
作用:判断signum信号是否在set信号集中
返回值:
返回1:存在
返回0:不存在
返回-1:出错
- sigprocmask函数
#include <signal.h>
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);(单线程)
作用:向信号掩码中添加或移除信号
参数:
how:指定函数行为
SIG_BLOCK:将set信号集中的指定信号添加到掩码中 即:mask |= set
SIG_UNBLOCK:将set信号集中的指定信号从掩码中移除 即:mask &= ~set
SIG_SETMASK:将set信号集中的信号集赋值给信号掩码 即:mask = set
set:需要设置的信号集
oldset:用于返回之前的信号掩码。否则设置为NULL
返回值:
成功:返回0
失败:返回-1,且设置errno为EINVAL
二、信号操作
- signal函数:
#include <signal.h>
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
作用:设置信号处理动作
参数:
handler:信号处理函数指针,无指定时可以使用SIG_DFL(将信号处理还原为默认值)和SIG_IGN(忽略信号)
返回值:
成功:返回捕捉函数句柄
错误:返回SIG_ERR
- kill函数
#include <sys/types.h>
#include <signal.h>
int kill(pid_t pid, int sig);
作用:
一个进程向另一个进程发送信号
参数:
pid:
pid>0,发送信号给指定的进程
pid=0,发送信号给与调用进程同组的每个进程
pid<-1,向组ID等于该pid绝对值的进程组内所有下属进程发送信号
pid=-1,调用进程将信号发往的每个目标进程,除去init进程和自身进程
sig:
要发送的信号,当sig=0,可以用来检测是否存在pid进程
返回值:
成功:返回0;
错误:返回-1并且errno设置为ESRCH
- sigpending函数
#include <signal.h>
int sigpending(sigset_t *set);
作用:当进程接收到一个阻塞的信号,会将此信号增加到进程的等待信号集中。
此函数返回进程的等待信号集,赋值到set中
返回值:
成功:返回0
失败:返回-1
- sigsuspend函数
#include <signal.h>
int sigsuspend(const sigset_t *mask);
作用:是一个原子操作,用来挂起一个进程
返回值:
正常返回值为-1,并将errno设置为EINTR;若mask指向的地址无效,则将errno设置为EFAULT
注意:sigsuspend是一个原子操作(将解除信号阻塞和挂起进程这两动作封装成一个原子操作):
(1)设置新的mask阻塞当前进程
(2)程序挂起;收到信号,恢复原先的mask
(3)调用该进程设置的信号处理函数
(4)待信号处理函数返回,sigsuspend返回
- sigaction函数
#include <signal.h>
int sigaction(int signum, const struct sigaction *act,struct sigaction *oldact);
作用:设置信号,比signal函数复杂、灵活、可移植性好
参数:
signum:可以是除SIGKILL和SIGSTOP信号之外的所有信号编号
act:指向描述信号新处置的数据结构(struct sigaction结构体)
oldact:返回之前信号处置的数据结构信息
返回值:
成功:返回0
失败:返回-1
(1)struct sigaction结构体:
struct sigaction
{
void (*sa_handler)(int); //信号处理函数
void (*sa_sigaction)(int, siginfo_t *, void *); //信号处理函数
sigset_t sa_mask; //信号掩码
int sa_flags;
void (*sa_restorer)(void); //内部使用,用来确保信号处理完后,return到进程接着执行
};
sa_handler和sa_sigaction函数只会使用其中之一。
注意:
需要使用sa_sigaction函数时,对应sa_flags需要设置为SA_SIGINFO。表示信号附带的参数可以被传递到
信号处理函数中,因此,应该为sigaction结构中的sa_sigaction指定处理函数同时需要声明定义函数:
void handler(int sig, siginfo_t *siginfo, void *ucontext); //信号处理函数
参数:
sig:表示信号编号
siginfo:包含进程运行等信息
ucontext:几乎不用
(2)siginfo_t 结构体定义:
typedef struct
{
int si_signo; /* Signal number */
int si_errno; /* An errno value */
int si_code; /* Signal code */
int si_trapno; /* Trap number that caused hardware-generated signal */
pid_t si_pid; /* Sending process ID */
uid_t si_uid; /* Real user ID of sending process */
int si_status; /* Exit value or signal */
clock_t si_utime; /* User time consumed */
clock_t si_stime; /* System time consumed */
sigval_t si_value; /* Signal value */
int si_int; /* POSIX.1b signal */
void *si_ptr; /* POSIX.1b signal */
int si_overrun; /* Timer overrun count */
int si_timerid; /* Timer ID; POSIX.1b timers */
void *si_addr; /* Memory location which caused fault */
long si_band; /* Band event */
int si_fd; /* File descriptor */
short si_addr_lsb; /* Least significant bit of address */
void *si_call_addr; /* Address of system call instruction*/
int si_syscall; /* Number of attempted system call*/
unsigned int si_arch; /* Architecture of attempted system call */
}siginfo_t;