信号

// <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);