信号Signa

来源:互联网 发布:淘宝商城 天猫裙子 编辑:程序博客网 时间:2024/05/22 09:38

author:Sun

--------------------------------------------------------------------------------------------------

1.信号的处理:
  1).忽略此信号。但有两种信号不能忽略:SIGKILL SIGSTOP
  2).捕捉信号。捕捉到SIGCHLD信号,表示一个子进程已经终止,所以此信号的捕捉函数可调用waitpid以取得该子进程的进程ID以及它的终止状态。不能捕捉SIGKILL和SIGSTOP信号
  3).执行系统默认动作
2.注册:更改系统默认中断操作
  sighandler_t signal(int signum, sighandler_t handler); 返回值不时error即成功
  signum是整数,第二个参数是函数指针,所指向的函数需要一个整型参数,无返回值。signal返回一个函数指针,该函数有一个整形参数。  typedef void(*sighandler_t)(int)
  也就是说signal的第二个参数指向该函数(信号处理程序)的指针,返回值指向之前的信号处理程序的指针。
3.kill和raise函数
  int kill(pid_t pid, int sig);  将信号发送给进程或者进程组
  int raise(int sig);            给自身发送信号
  若成功返回0,出错返回-1。
4.alarm和pause函数
  unsigned int alarm(unsigned int seconds);设置一个计时器 返回0或闹钟时间的余留秒数
  seconds是秒数,经过指定秒数产生信号SIGALRM,信号由内核产生。每个进程只有一个闹钟,可多次调用,新的闹钟会覆盖旧的闹钟,余留值作为本次函数调用值返回。若想捕捉SIGALRM信号,则必须在调用alarm之前设置该信号的处理程序。否则先调用alarm,然后再SIGALRM处理程序之前已接受到该信号,那么进程将终止。
  int pause(void);  调用进程挂起直至捕捉到一个信号。只有执行了一个信号处理程序并返回,pause才返回。
5.设置sigprocmask函数:调用此函数可检测或更改信号屏蔽字
   int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
   how:SIG_BLOCK 阻塞信号 SIG_UNBLOCK解除阻塞的信号 SIG_SETMASK 用当前值覆盖旧的值
6.sigpending函数
   int sigpending(sigset_t *set); 返回信号集。各个信号对于调用进程是阻塞的
7.sigsuspend函数
   int sigsuspend(const sigset_t *mask);临时替换当前信号的屏蔽字
   mask传屏蔽字地址,遇到屏蔽字替换。在捕捉到一个信号或发生了一个会终止该进程的信号之前,进程处于挂起状态。返回时,进程的信号屏蔽字设置为调用前的值。
8.sigaction函数
   int sigaction(int signum, const struct sigaction *act,struct sigaction *oldact);
  signum是要修改或检测动作的信号编号。act非空则修改其动作,oldact非空,系统经由act指针返回该信号的上一个动作

0 0