#ifndef _SIGNAL_H
#define _SIGNAL_H

#include <sys/types.h>		// ͷļ˻ϵͳ͡

typedef int sig_atomic_t;	// źԭӲ͡
typedef unsigned int sigset_t;	/* 32 bits */// źż͡

#define _NSIG 32		// ź -- 32 ֡
#define NSIG _NSIG		// NSIG = _NSIG

// ЩLinux 0.11 ںжźš
#define SIGHUP 1		// Hang Up -- ҶϿն˻̡
#define SIGINT 2		// Interrupt -- Լ̵жϡ
#define SIGQUIT 3		// Quit -- Լ̵˳
#define SIGILL 4		// Illeagle -- Ƿָ
#define SIGTRAP 5		// Trap -- ٶϵ㡣
#define SIGABRT 6		// Abort -- 쳣
#define SIGIOT 6		// IO Trap -- ͬϡ
#define SIGUNUSED 7		// Unused -- ûʹá
#define SIGFPE 8		// FPE -- Э
#define SIGKILL 9		// Kill -- ǿȽֹ
#define SIGUSR1 10		// User1 -- ûź1̿ʹá
#define SIGSEGV 11		// Segment Violation -- Чڴá
#define SIGUSR2 12		// User2 -- ûź2̿ʹá
#define SIGPIPE 13		// Pipe -- ܵд޶ߡ
#define SIGALRM 14		// Alarm -- ʵʱʱ
#define SIGTERM 15		// Terminate -- ֹ
#define SIGSTKFLT 16		// Stack Fault -- ջЭ
#define SIGCHLD 17		// Child -- ӽֹֹͣ
#define SIGCONT 18		// Continue -- ִָ̼С
#define SIGSTOP 19		// Stop -- ̵ִֹͣС
#define SIGTSTP 20		// TTY Stop -- tty ֹ̣ͣɺԡ
#define SIGTTIN 21		// TTY In -- ̨롣
#define SIGTTOU 22		// TTY Out -- ̨

/* Ok, I haven't implemented sigactions, but trying to keep headers POSIX */
/* OKһûʵsigactions ıƣͷļϣPOSIX ׼ */
#define SA_NOCLDSTOP 1		// ӽ̴ֹͣ״̬ͲSIGCHLD 
#define SA_NOMASK 0x40000000	// ָֹźŴ(źž)յźš
#define SA_ONESHOT 0x80000000	// źžһùͻָĬϴ

// ²sigprocmask()-- ıźż()ЩԸıúΪ
#define SIG_BLOCK 0		/* for blocking signals */
// źżмϸźż
#define SIG_UNBLOCK 1		/* for unblocking signals */
// źżɾָźż
#define SIG_SETMASK 2		/* for setting the signal mask */
// źżź룩

#define SIG_DFL ((void (*)(int))0)	/* default signal handling */
// ĬϵźŴźž
#define SIG_IGN ((void (*)(int))1)	/* ignore signal */
// źŵĴ

// sigaction ݽṹ
// sa_handler ǶӦĳźָҪȡжSIG_DFLSIG_IGN 
// źţҲָźźһָ롣
// sa_mask ˶źŵ룬źųִʱЩźŵĴ
// sa_flags ָıźŴ̵źż37-39 еλ־ġ
// sa_restorer ָָ룬ڱԭصĹָ롣
// ⣬𴥷źŴźҲʹSA_NOMASK ־
struct sigaction
{
  void (*sa_handler) (int);
  sigset_t sa_mask;
  int sa_flags;
  void (*sa_restorer) (void);
};

// Ϊź_sig װһµźŴźžsigaction()ơ
void (*signal (int _sig, void (*_func) (int))) (int);
// ǰ̷һźšõȼkill(getpid(),sig)
int raise (int sig);
// κν̷κźš
int kill (pid_t pid, int sig);
// źżźš
int sigaddset (sigset_t * mask, int signo);
// źżȥָźš
int sigdelset (sigset_t * mask, int signo);
// źżָźż
int sigemptyset (sigset_t * mask);
// źżźš
int sigfillset (sigset_t * mask);
// жһźǷźżеġ1 -- ǣ 0 -- ǣ -1 -- 
int sigismember (sigset_t * mask, int signo);	/* 1 - is, 0 - not, -1 error */
// set еźŽм⣬Ƿйźš
int sigpending (sigset_t * set);
// ıĿǰıźżź룩
int sigprocmask (int how, sigset_t * set, sigset_t * oldset);
// sigmask ʱ滻̵ź,Ȼͣýֱյһźš
int sigsuspend (sigset_t * sigmask);
// ڸıյָźʱȡж
int sigaction (int sig, struct sigaction *act, struct sigaction *oldact);

#endif /* _SIGNAL_H */
