/* Signals. */
#define SIGHUP 1 /* Hangup (POSIX). */
#define SIGINT 2 /* Interrupt (ANSI). */
#define SIGQUIT 3 /* Quit (POSIX). */
#define SIGILL 4 /* Illegal instruction (ANSI). */
#define SIGTRAP 5 /* Trace trap (POSIX). */
#define SIGABRT 6 /* Abort (ANSI). */
#define SIGIOT 6 /* IOT trap (4.2 BSD). */
#define SIGBUS 7 /* BUS error (4.2 BSD). */
#define SIGFPE 8 /* Floating-point exception (ANSI). */
#define SIGKILL 9 /* Kill, unblockable (POSIX). */
#define SIGUSR1 10 /* User-defined signal 1 (POSIX). */
#define SIGSEGV 11 /* Segmentation violation (ANSI). */
#define SIGUSR2 12 /* User-defined signal 2 (POSIX). */
#define SIGPIPE 13 /* Broken pipe (POSIX). */
#define SIGALRM 14 /* Alarm clock (POSIX). */
#define SIGTERM 15 /* Termination (ANSI). */
#define SIGSTKFLT 16 /* Stack fault. */
#define SIGCLD SIGCHLD /* Same as SIGCHLD (System V). */
#define SIGCHLD 17 /* Child status has changed (POSIX). */
#define SIGCONT 18 /* Continue (POSIX). */
#define SIGSTOP 19 /* Stop, unblockable (POSIX). */
#define SIGTSTP 20 /* Keyboard stop (POSIX). */
#define SIGTTIN 21 /* Background read from tty (POSIX). */
#define SIGTTOU 22 /* Background write to tty (POSIX). */
#define SIGURG 23 /* Urgent condition on socket (4.2 BSD). */
#define SIGXCPU 24 /* CPU limit exceeded (4.2 BSD). */
#define SIGXFSZ 25 /* File size limit exceeded (4.2 BSD). */
#define SIGVTALRM 26 /* Virtual alarm clock (4.2 BSD). */
#define SIGPROF 27 /* Profiling alarm clock (4.2 BSD). */
#define SIGWINCH 28 /* Window size change (4.3 BSD, Sun). */
#define SIGPOLL SIGIO /* Pollable event occurred (System V). */
#define SIGIO 29 /* I/O now possible (4.2 BSD). */
#define SIGPWR 30 /* Power failure restart (System V). */
#define SIGSYS 31 /* Bad system call. */
#define SIGUNUSED 31
#define _NSIG 65 /* Biggest signal number + 1
(including real-time signals). */
typedef void (*__sighandler_t) (int);
extern __sighandler_t signal (int __sig, __sighandler_t __handler) __THROW; //注册信号捕捉函数
/* Fake signal functions. */
#define SIG_ERR ((__sighandler_t) -1) /* Error return. */
#define SIG_DFL ((__sighandler_t) 0) /* Default action. */
#define SIG_IGN ((__sighandler_t) 1) /* Ignore signal. */
extern int kill (__pid_t __pid, int __sig) __THROW; //向进程pid发送信号sig
extern int raise (int __sig) __THROW; //向本进程发送信号sig
extern unsigned int alarm (unsigned int __seconds) __THROW;
extern unsigned int sleep (unsigned int __seconds);
extern int pause (void);
extern void abort (void) __THROW __attribute__ ((__noreturn__));
extern int sigemptyset (sigset_t *__set) __THROW __nonnull ((1));
extern int sigfillset (sigset_t *__set) __THROW __nonnull ((1));
extern int sigaddset (sigset_t *__set, int __signo) __THROW __nonnull ((1));
extern int sigdelset (sigset_t *__set, int __signo) __THROW __nonnull ((1));
extern int sigismember (__const sigset_t *__set, int __signo) __THROW __nonnull ((1));
extern int sigprocmask (int __how, __const sigset_t *__restrict __set, sigset_t *__restrict __oset) __THROW;
extern int sigpending (sigset_t *__set) __THROW __nonnull ((1));
extern int sigsuspend (__const sigset_t *__set) __nonnull ((1));
extern int sigaction (int __sig, __const struct sigaction *__restrict __act, struct sigaction *__restrict __oact) __THROW;
struct sigaction
{
/* Signal handler. */
#ifdef __USE_POSIX199309
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);
};
代码示例:
#include "unp.h"
#include "apue.h"
#include
#include
#include
#include
#include
#include
#include
//#include
//#include
static sigjmp_buf jmp_buffer; void sleep_handler(int); int my_sleep(int sec) { struct sigaction my_act; struct sigaction my_oact; //上次的sigaction值 /*初始化*/ my_act.sa_handler = sleep_handler; //注册信号处理函数 sigemptyset(&my_act.sa_mask); //不增加新的信号屏蔽位 my_act.sa_flags = 0; //不接收额外信息 my_act.sa_restorer = NULL; /*注册信号捕捉函数*/ if(sigaction(SIGALRM, &my_act, &my_oact) < 0) { puts("signal registration error"); return sec; } /*时钟超时后,回到这一句执行*/ if(sigsetjmp(jmp_buffer, 1) == 0) { //设置超时时间 alarm(sec); pause(); } //重新将超时时钟设为0 return alarm(0); } void sleep_handler(int signo) { siglongjmp(jmp_buffer, 1); return; } int main(int argc, char *argv[]) { sigset_t sig_test; sigset_t sig_otest; sigset_t sig_test2; int rv; sigemptyset(&sig_test); if((rv = sigismember(&sig_test, SIGALRM)) == 1) { puts("1:SIGALRM is set"); } else if(rv == 0) { puts("1:SIGALRM is not set"); } sigfillset(&sig_test); if((rv = sigismember(&sig_test, SIGALRM)) == 1) { puts("2:SIGALRM is set"); } else if(rv == 0) { puts("2:SIGALRM is not set"); } sigemptyset(&sig_test); sigaddset(&sig_test, SIGUSR1); if((rv = sigismember(&sig_test, SIGUSR1)) == 1) { puts("3:SIGUSR1 is set"); } else if(rv == 0) { puts("3:SIGUSR1 is not set"); } sigdelset(&sig_test, SIGUSR1); if((rv = sigismember(&sig_test, SIGUSR1)) == 1) { puts("4:SIGUSR1 is set"); } else if(rv == 0) { puts("4:SIGUSR1 is not set"); } sigaddset(&sig_test, SIGUSR1); sigprocmask(SIG_BLOCK, &sig_test, &sig_otest); raise(SIGUSR1); sigpending(&sig_test2); if((rv = sigismember(&sig_test2, SIGUSR1)) == 1) { puts("5:SIGUSR1 is pending"); } else if(rv == 0) { puts("5:SIGUSR1 is not pending"); } puts("before sleep"); my_sleep(5); puts("after sleep"); exit(0); }
#include "unp.h"
#include "apue.h"
#include
#include
#include
#include
#include
#include
#include
static jmp_buf jmp_buffer; void sleep_handler(int); int my_sleep(int sec) { /*注册信号捕捉函数*/ if(signal(SIGALRM, sleep_handler) == SIG_ERR) { puts("signal registration error"); return sec; } /*时钟超时后,回到这一句执行*/ if(setjmp(jmp_buffer) == 0) { //设置超时时间 alarm(sec); pause(); } //重新将超时时钟设为0 return alarm(0); } void sleep_handler(int signo) { longjmp(jmp_buffer, 1); return; } int main(int argc, char *argv[]) { puts("before sleep"); my_sleep(5); puts("after sleep"); exit(0); }
#include "unp.h"
#include "apue.h"
#include
#include
#include
#include
#include
#include
#include
//#include
//#include
static sigjmp_buf jmp_buffer; void sleep_handler(int); int my_sleep(int sec) { struct sigaction my_act; struct sigaction my_oact; //上次的sigaction值 /*初始化*/ my_act.sa_handler = sleep_handler; //注册信号处理函数 sigemptyset(&my_act.sa_mask); //不增加新的信号屏蔽位 my_act.sa_flags = 0; //不接收额外信息 my_act.sa_restorer = NULL; /*注册信号捕捉函数*/ if(sigaction(SIGALRM, &my_act, &my_oact) < 0) { puts("signal registration error"); return sec; } /*时钟超时后,回到这一句执行*/ if(sigsetjmp(jmp_buffer, 1) == 0) { //设置超时时间 alarm(sec); pause(); } //重新将超时时钟设为0 return alarm(0); } void sleep_handler(int signo) { siglongjmp(jmp_buffer, 1); return; } int main(int argc, char *argv[]) { sigset_t sig_test; sigset_t sig_otest; sigset_t sig_test2; int rv; sigemptyset(&sig_test); if((rv = sigismember(&sig_test, SIGALRM)) == 1) { puts("1:SIGALRM is set"); } else if(rv == 0) { puts("1:SIGALRM is not set"); } sigfillset(&sig_test); if((rv = sigismember(&sig_test, SIGALRM)) == 1) { puts("2:SIGALRM is set"); } else if(rv == 0) { puts("2:SIGALRM is not set"); } sigemptyset(&sig_test); sigaddset(&sig_test, SIGUSR1); if((rv = sigismember(&sig_test, SIGUSR1)) == 1) { puts("3:SIGUSR1 is set"); } else if(rv == 0) { puts("3:SIGUSR1 is not set"); } sigdelset(&sig_test, SIGUSR1); if((rv = sigismember(&sig_test, SIGUSR1)) == 1) { puts("4:SIGUSR1 is set"); } else if(rv == 0) { puts("4:SIGUSR1 is not set"); } sigaddset(&sig_test, SIGUSR1); sigprocmask(SIG_BLOCK, &sig_test, &sig_otest); raise(SIGUSR1); sigpending(&sig_test2); if((rv = sigismember(&sig_test2, SIGUSR1)) == 1) { puts("5:SIGUSR1 is pending"); } else if(rv == 0) { puts("5:SIGUSR1 is not pending"); } puts("before sleep"); my_sleep(5); puts("after sleep"); exit(0); }
#include "unp.h"
#include "apue.h"
#include
#include
#include
#include
#include
#include
#include
static jmp_buf jmp_buffer; void sleep_handler(int); int my_sleep(int sec) { /*注册信号捕捉函数*/ if(signal(SIGALRM, sleep_handler) == SIG_ERR) { puts("signal registration error"); return sec; } /*时钟超时后,回到这一句执行*/ if(setjmp(jmp_buffer) == 0) { //设置超时时间 alarm(sec); pause(); } //重新将超时时钟设为0 return alarm(0); } void sleep_handler(int signo) { longjmp(jmp_buffer, 1); return; } int main(int argc, char *argv[]) { puts("before sleep"); my_sleep(5); puts("after sleep"); exit(0); }