信号
// <signal.h> ->
// /usr/include/x86_64-linux-gnu/bits/sigaction.h
/* Structure describing the action to be taken when a signal arrives. */
struct sigaction
{
/* Signal handler. */
#if defined __USE_POSIX199309 || defined __USE_XOPEN_EXTENDED
union
{
/* Used if SA_SIGINFO is not set. */
__sighandler_t sa_handler;
/* Used if SA_SIGINFO is set. */
void (*sa_sigaction) (int, siginfo_t *, void *);
}
__sigaction_handler;
# define sa_handler __sigaction_handler.sa_handler
# define sa_sigaction __sigaction_handler.sa_sigaction
#else
__sighandler_t sa_handler;
#endif
/* Additional set of signals to be blocked. */
__sigset_t sa_mask;
/* Special flags. */
int sa_flags;
/* Restore handler. */
void (*sa_restorer) (void);
};
// /usr/include/x86_64-linux-gnu/bits/types/sigset_t.h
#ifndef __sigset_t_defined
#define __sigset_t_defined 1
#include <bits/types/__sigset_t.h>
/* A set of signals to be blocked, unblocked, or waited for. */
typedef __sigset_t sigset_t;
#endif
// /usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h
#ifndef ____sigset_t_defined
#define ____sigset_t_defined
#define _SIGSET_NWORDS (1024 / (8 * sizeof (unsigned long int)))
typedef struct
{
unsigned long int __val[_SIGSET_NWORDS];
} __sigset_t;
#endif
必需的信号
符号常量 | 描述 |
SIGABRT | 非正常终止信号 |
SIGALRM | 超时信号 |
SIGFPE | 错误运算操作 |
SIGHUP | 控制中断所检测到的挂断 |
SIGILL | 无效硬件信号的检测 |
SIGINT | 交叉式信号 |
SIGKILL | 终止信号 |
SIGPIPE | 写信号 |
SIGQUIT | 交互式终止信号 |
SIGSEGV | 无效内存引用检测信号 |
SIGTERM | 终止信号 |
SIGUSR1 | 保留信号 |
SIGUSR2 | 保留信号 |
作业控制信号
符号常数 | 描述 |
SIGCHLD | 子进程终止或停止 |
SIGCONT | 停止后继续 |
SIGSTOP | 停止信号 |
SIGTSTP | 交互式的停止信号 |
SIGTTIN | 从控制终端读 |
SIGTTOU | 写到控制终端 |
内存保护信号
符号常数 | 描述 |
SIGBUS | 获取内存中不确定的部分 |
每一个进程有一个进程标记( process mask),它定义了一组产生但被阻塞传递的信号集
送一个信号到进程:
#include <sys/types.h>
#include <signal.h>
/*
*发送一个信号到一个由 pid 指明的 进程或 进程组
*sig :标志了信号类型,其值是 0 或 上表中的值
*成功:0
*失败:1
*/
int kill(pid_t pid, int sig);
操纵信号集
#include <signal.h>
/*
*sigsetops 源语操纵信号集
*操作以数字为对象,数据由应用程序的地址所指向
*/
int sigemptyset(sigset_t *set);
int sigfillset(sigset_t *set);
int sigaddset(sigset_t *set, int signo);
int sigdelset(sigset_t *set, int signo);
nt sigsemeber(const sigset_t *set, int signo);
检测和更改信号的行为
#include <signal.h>
/*
*调用函数检查与确定的信号相联系的行为
* sig: 信号
* act:采取的行为
* oact != NULL, 先前与信号相联系的行为将被存储到由 oact 指向的地方
*/
int sigaction(int sig, const struct sigaction *act, struct sigaction *oact);
检查和改变阻塞信号
#include <signal.h>
/*
*检查和改变调用进程的信号标记(signal mask)
*set != null,它指向一个信号集的用于改变当前的阻塞集
*how :指明了改变方式
*oset != null,先前的信号标记被存储在它所指向的地方
*set = null,则how 没有意义,而且 进程的信号标记不能随函数调用而改变
*/
int sigprocmask(int how, xonst sigset_t *set, sigset_t *oset);
检查未定的信号
#include <signal.h>
/*
*存储一个信号集,这些信号是在被调用进程传输和未定的情况下阻塞
* set : 指向
*/
int sigpending(sigset_t *set);
等待一个信号
#include <signal.h>
/*
*sigmask:所指向的信号集取代了进程信号标记(signal mask)
*挂起该进程直到接受到一个信号,行为:执行信号跟踪功能或 终止该进程
*/
int sigsuspend(const sigset_t *sigmask);
同步接受一个信号
#include <signal.h>
/*
*从 set 所确定的信号集中选择一个未定的信号出来
* 成功:返回一个信号数
* 失败:返回 -1
*/
int sigwaitinfo(const sigset_t *set, siginfo_t *info);
int sigtimedwait(const sigset_t *set, siginfo_ *info, const struct timespec *timeout);
排队一个信号到进程
#include <signal.h>
/*
* 由 signo 确定的信号将参数 value 所确定的值发送到由 pid 指明的进程中去
*/
int sigqueue(pid_t pid, int signo, const union_sigval value);
定时器操作
调度警报
//seconds 指定的一段实时时间过去后,该函数将发送一个 SIGALRM 信号到调用进程
unsigned int alarm(unsigned int seconds);
挂起进程的执行
/*
*挂起一个调用进程直到得到一个信号,这个信号或 执行信号跟踪功能或 终止该进程
*终止进程,该函数不返回
*执行信号跟踪功能,则该函数在信号跟踪函数返回后 也要返回
*/
int pause(void);
延迟进程的执行
/*使当前进程从执行状态转化为 挂起状态
* 直到参数 seconds 所指定的一段实时时间过去后,
* 或 一个唤醒信号跟踪功能或终止进程功能的信号到来
*挂起时间由于系统的其他调度活动可能会比要求的时间长
*/
unsigned int sleep(unsigned int seconds);