#include <unistd.h>
int pause(void);
功能:让调用者进入休眠状态,直到进程遇到信号才会被唤醒
返回值:要么不返回在休眠,要么唤醒后返回-1
#include <unistd.h>
unsigned int sleep(unsigned int seconds);、
功能:让调用者进入休眠指定的秒数,当遇到信号时会提前唤醒返回
返回值:剩余的休眠时间
#include <unistd.h>
unsigned int alarm(unsigned int seconds);
功能:让内核在seconds秒后向进程发送SIGALRM信号
返回值:上次alarm设置的剩余秒数
四、信号集合信号阻塞
信号集:是一种数据类型,定义的变量可以存储多个信号
sigset_t 128位的二进制数,每一位都固定代表了一种信号
相关函数:
#include <signal.h>
int sigemptyset(sigset_t *set);
功能:清空信号集
int sigfillset(sigset_t *set);
功能:填满信号集
int sigaddset(sigset_t *set, int signum);
功能:添加向信号集set中添加信号signum
int sigdelset(sigset_t *set, int signum);
功能:从信号集set中删除信号signum
int sigismember(const sigset_t *set, int signum);
功能:测试信号集中是否存在signum信号
返回值:
0 不存在
1 存在
-1 signum信号非法
信号阻塞:
当程序执行到一些特殊操作时,不适合处理信号,此时可以让内核先屏蔽信号,等操作执行完成后再解除屏蔽重新发送信号
当信号产生时,内核会在其维护的信号表中为对应的进程设置与该信号对应的标记,这个过程叫做递送
从信号产生到完成递送有个时间间隔处于这个间隔的信号状态成为未决
信号屏蔽、阻塞就是让被屏蔽的信号现处于未决状态、暂停递送,当屏蔽解除时在继续递送
#include <signal.h>
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
功能:设置要屏蔽的信号、这些信号是存储在信号集里面
how:信号屏蔽的方式
SIG_BLOCK 把set中的信号添加到要屏蔽的信号集里
SIG_UNBLOCK 从信号屏蔽集中删除set中的信号 解除
SIG_SETMASK 把set替换之前的信号屏蔽集
set:是准备好的信号集
oldset:获取旧的信号屏蔽集
五、附带信息的信号处理
#include <signal.h>
int sigaction(int signum, const struct sigaction *act,struct sigaction *oldact);
功能:向内核注册一个信号处理函数
signum:要捕获的信号编码
act: 设置要处理的动作
olact: 获取原来的处理动作
struct sigaction {
void (*sa_handler)(int);//不附带其他信息的信号处理函数
void (*sa_sigaction)(int, siginfo_t *, void *);//附带其他信息的信号处理函数
sigset_t sa_mask;//信号屏蔽集
int sa_flags;//信号处理动作的标志
SA_NODEFER 在信号处理过程中不要屏蔽当前信号
SA_SIGINFO 使用sa_sigaction函数指针
void (*sa_restorer)(void);//保留函数
};
siginfo_t {
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
(unused on most architectures) */
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;
POSIX.1b timers */
int si_timerid; /* Timer ID; POSIX.1b timers */
void *si_addr; /* Memory location which caused fault */
long si_band; /* Band event (was int in
glibc 2.3.2 and earlier) */
int si_fd; /* File descriptor */
short si_addr_lsb; /* Least significant bit of address
(since Linux 2.6.32) */
void *si_call_addr; /* Address of system call instruction
(since Linux 3.5) */
int si_syscall; /* Number of attempted system call
(since Linux 3.5) */
unsigned int si_arch; /* Architecture of attempted system call
(since Linux 3.5) */
}
#include <signal.h>
int sigqueue(pid_t pid, int sig, const union sigval value);
功能:向指定的进程发送指定信号并附加信息一起发送
value:附加的信息
union sigval {
int sival_int;//整数
void *sival_ptr;//指针
};