感谢支持
我们一直在努力

浅析 Linux/UNIX 信号机制

      信号常常被称为“软中断”,和“中断”类似,用来通知程序发生异步事件。对信号的处理一般来说有三种方式:忽略,终止进程以及使用信号处理函数。信号处理函数的方式是从一处执行流断开,转而去运行另外的一处代码(信号处理),当处理函数返回时,继续从断开的地方继续执行。

1、安装信号处理函数

  在系统编程的层面上与信号的处理关系最直接相关的函数有两个,他们用来安装信号处理函数:

      sighandler_t signal(int signum, sighandler_t handler);

      int sigaction(int signum, const struct sigaction *act,,struct sigaction *oldact);

    第一个函数signal比较简单,sighandler_t 是一个别名,其原型是 typedef void (*sighandler_t)(int),他是一个函数指针,接受一个类型为int的参数(信号的编号),返回void。例如要对SIGUSR1信号进行处理:

void handler(int sig)
{
    //strsiganl 功能是把信号的编号转为信号说明的字符串
    printf(“Rcv a signal:%s”,strsignal(sig));
}

int main()
{
    signal(SIGUSR1,handler);
    while(1)
        ;     
}

 (这段程序其实是有问题的,后面会说到)这段程序本来是一段死循环,但是对他发送SIGUSR1信号,程序会从while中“中断”转去执行handler中的代码。在shell中使用kill命令发送信号SIGUSR1 于是程序就答应出了一段这样的信息:Rcv a signal:User defined signal 1。signal()的用法几乎就是这么简单。但是由于可移植的原因,参与项目开发时,应该使用下面的这个函数。

  sigaction()函数的参数中有两个结构体,其man手册原型如下:

struct sigaction {
 void (*sa_handler)(int);
 void (*sa_sigaction)(int, siginfo_t *, void *);
 sigset_t sa_mask;
 int sa_flags;
 void (*sa_restorer)(void);
 };

据我所知sa_handler和sa_sigaction其实是在一个union中,他们都是指向信号处理函数的指针。

  sa_mask 是要屏蔽的信号,sa_flags 有多种选项。(关于这两点后文再细说)。从sigaction()原型中可以发现参数中有两个struct sigaction参数,其中act是要安装的信号处理,而oldact是用来带回原来的处理方式方便我们处理完信号后的恢复。如果不需要拿回之前的信号处理方式可以把第三个参数置为NULL,反之如果只想得到之前的处理方式而不像安装新的信号处理,可以把第二个参数置为NULL,这点用signal()是办不到的。用sigaction()改写上面的例子是这样的:

 1 void handler(int sig)
 2 {
 3    printf(“Rcv a signal:%s”,strsignal(sig));
 4 }
 5
 6 int main()
 7 {
 8    struct sigaction act;
 9    sigemptyset(&act.sa_mask);
10    act.sa_handler = handler;
11    act.sa_flags = 0;
12    sigaction(SIGUSR1,&act,NULL);
13    while(1)
14        ;       
15 }

2、信号阻塞、信号的未决

  sigset_t 是一种将信号类型以为位掩码形式存在的数据类型(下文都称之为信号集),他是多种信号的集合(可以保证容纳所有的信号)。操作系统的PCB为每个进程都维护了一个这样的数据类型,并将其内所有的信号阻塞,使他们不可以实时到达进程。当信号屏蔽解除时他们才被传递到进程。在这之间的状态通常被称为未决(pending)。而在信号阻塞期间多次到来的信号,在信号屏蔽解除时只会被报告一次。

  对sigset_t 处理有一系列函数,其中POSIX标准有5个

int sigemptyset(sigset_t *set);

int sigfillset(sigset_t *set);

int sigaddset(sigset_t *set, int signum);

int sigdelset(sigset_t *set, int signum);

int sigismember(const sigset_t *set, int signum);

  这样的函数基本上看参数就能知道怎么用,不在赘述。

  glibc中还实现了3个扩展的函数:

int sigisemptyset(sigset_t *set);

int sigorset(sigset_t *dest, sigset_t *left, sigset_t *right);

int sigandset(sigset_t *dest, sigset_t *left, sigset_t *right);

  sigprocmask()函数可以检测和更改信号屏蔽集。

  每个进程都有一个用来描述哪些信号递送到进程时将被阻塞的信号集,该信号集中的所有信号在递送到进程后都将被阻塞。  

int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);

how 说明
SIG_BLOCK 将set中的信号与原有的取并集,并更新进程的屏蔽字
SIG_UNBLOCK 解除原有的信号集中包含set中的信号,(set补集的交集)
SIG_SETMASK 将进程的屏蔽字设置为set

sigpending函数可以看到信号屏蔽期间那些信号来到过(不计次数的)。

更多详情见请继续阅读下一页的精彩内容: http://www.linuxidc.com/Linux/2015-07/120632p2.htm

Linux man手册关于signal的介绍
SIGNAL(7)                  Linux Programmer’s Manual                SIGNAL(7)

NAME
      signal – overview of signals

DESCRIPTION
      Linux  supports both POSIX reliable signals (hereinafter “standard sig鈥�
      nals”) and POSIX real-time signals.

  Signal Dispositions
      Each signal has a current disposition, which determines how the process
      behaves when it is delivered the signal.

      The  entries  in  the  “Action”  column of the tables below specify the
      default disposition for each signal, as follows:

      Term  Default action is to terminate the process.

      Ign    Default action is to ignore the signal.

      Core  Default action is to terminate the process and  dump  core  (see
              core(5)).

      Stop  Default action is to stop the process.

      Cont  Default  action  is  to  continue the process if it is currently
              stopped.

      A process can change the disposition of a signal using sigaction(2)  or
      signal(2).  (The  latter  is  less portable when establishing a signal
      handler; see signal(2) for  details.)  Using  these  system  calls,  a
      process  can  elect one of the following behaviors to occur on delivery
      of the signal: perform the default action; ignore the signal; or  catch
      the signal with a signal handler, a programmer-defined function that is
      automatically invoked when the signal is delivered.  (By  default,  the
      signal  handler is invoked on the normal process stack.  It is possible
      to arrange that the signal handler uses an alternate stack; see sigalt鈥�
      stack(2)  for  a discussion of how to do this and when it might be use鈥�
      ful.)

      The signal disposition is a per-process attribute: in  a  multithreaded
      application, the disposition of a particular signal is the same for all
      threads.

      A child created via fork(2) inherits a copy of its parent’s signal dis鈥�
      positions.  During  an  execve(2), the dispositions of handled signals
      are reset to the default; the dispositions of ignored signals are  left
      unchanged.

  Sending a Signal
      The  following  system  calls and library functions allow the caller to
      send a signal:

      raise(3)        Sends a signal to the calling thread.

      kill(2)        Sends a signal to a specified process, to  all  members
                      of  a  specified  process group, or to all processes on
                      the system.

      killpg(2)      Sends a signal to all of the  members  of  a  specified
                      process group.

      pthread_kill(3) Sends  a signal to a specified POSIX thread in the same
                      process as the caller.

      tgkill(2)      Sends a signal to a specified thread within a  specific
                      process.  (This  is  the system call used to implement
                      pthread_kill(3).)

      sigqueue(3)    Sends a real-time signal with accompanying  data  to  a
                      specified process.

  Waiting for a Signal to be Caught
      The  following system calls suspend execution of the calling process or
      thread until a signal is caught (or an unhandled signal terminates  the
      process):

      pause(2)        Suspends execution until any signal is caught.

      sigsuspend(2)  Temporarily  changes  the  signal  mask (see below) and
                      suspends execution until one of the unmasked signals is
                      caught.

  Synchronously Accepting a Signal
      Rather  than  asynchronously catching a signal via a signal handler, it
      is possible to synchronously accept the signal, that is, to block  exe鈥�
      cution until the signal is delivered, at which point the kernel returns
      information about the signal to the caller.  There are two general ways
      to do this:

      * sigwaitinfo(2),  sigtimedwait(2),  and  sigwait(3)  suspend execution
        until one of the signals in a specified set is  delivered.  Each  of
        these calls returns information about the delivered signal.

      * signalfd(2) returns a file descriptor that can be used to read infor鈥�
        mation about signals that are delivered to the caller.  Each  read(2)
        from  this file descriptor blocks until one of the signals in the set
        specified in the signalfd(2) call is delivered to  the  caller.  The
        buffer  returned  by read(2) contains a structure describing the sig鈥�
        nal.

  Signal Mask and Pending Signals
      A signal may be blocked, which means that  it  will  not  be  delivered
      until it is later unblocked.  Between the time when it is generated and
      when it is delivered a signal is said to be pending.

      Each thread in a process has an independent signal  mask,  which  indi鈥�
      cates  the  set  of  signals  that the thread is currently blocking.  A
      thread can manipulate its signal mask using pthread_sigmask(3).  In  a
      traditional  single-threaded application, sigprocmask(2) can be used to
      manipulate the signal mask.

      A child created via fork(2) inherits a  copy  of  its  parent’s  signal
      mask; the signal mask is preserved across execve(2).

      A  signal  may be generated (and thus pending) for a process as a whole
      (e.g., when sent using kill(2)) or for a specific thread (e.g., certain
      signals, such as SIGSEGV and SIGFPE, generated as a consequence of exe鈥�
      cuting a specific machine-language instruction are thread directed,  as
      are  signals  targeted  at a specific thread using pthread_kill(3)).  A
      process-directed signal may be delivered to any one of the threads that
      does  not  currently  have the signal blocked.  If more than one of the
      threads has the signal unblocked, then the kernel chooses an  arbitrary
      thread to which to deliver the signal.

      A  thread  can  obtain the set of signals that it currently has pending
      using sigpending(2).  This set will consist of the union of the set  of
      pending process-directed signals and the set of signals pending for the
      calling thread.

      A child created via fork(2) initially has an empty pending signal  set;
      the pending signal set is preserved across an execve(2).

  Standard Signals
      Linux  supports the standard signals listed below.  Several signal num鈥�
      bers are architecture-dependent, as indicated in  the  “Value”  column.
      (Where three values are given, the first one is usually valid for alpha
      and sparc, the middle one for ix86, ia64, ppc, s390, arm  and  sh,  and
      the last one for mips.  A – denotes that a signal is absent on the cor鈥�
      responding architecture.)

      First the signals described in the original POSIX.1-1990 standard.

      Signal    Value    Action  Comment
      鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€
      SIGHUP        1      Term    Hangup detected on controlling terminal
                                    or death of controlling process
      SIGINT        2      Term    Interrupt from keyboard
      SIGQUIT      3      Core    Quit from keyboard
      SIGILL        4      Core    Illegal Instruction
      SIGABRT      6      Core    Abort signal from abort(3)
      SIGFPE        8      Core    Floating point exception
      SIGKILL      9      Term    Kill signal
      SIGSEGV      11      Core    Invalid memory reference
      SIGPIPE      13      Term    Broken pipe: write to pipe with no
                                    readers
      SIGALRM      14      Term    Timer signal from alarm(2)
      SIGTERM      15      Term    Termination signal
      SIGUSR1  30,10,16    Term    User-defined signal 1
      SIGUSR2  31,12,17    Term    User-defined signal 2
      SIGCHLD  20,17,18    Ign    Child stopped or terminated
      SIGCONT  19,18,25    Cont    Continue if stopped
      SIGSTOP  17,19,23    Stop    Stop process
      SIGTSTP  18,20,24    Stop    Stop typed at tty
      SIGTTIN  21,21,26    Stop    tty input for background process
      SIGTTOU  22,22,27    Stop    tty output for background process

      The signals SIGKILL and SIGSTOP cannot be caught, blocked, or ignored.

      Next the signals not in the  POSIX.1-1990  standard  but  described  in
      SUSv2 and POSIX.1-2001.

      Signal      Value    Action  Comment
      鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€
      SIGBUS      10,7,10    Core    Bus error (bad memory access)
      SIGPOLL                Term    Pollable event (Sys V).
                                      Synonym for SIGIO
      SIGPROF    27,27,29    Term    Profiling timer expired
      SIGSYS      12,31,12    Core    Bad argument to routine (SVr4)
      SIGTRAP        5        Core    Trace/breakpoint trap
      SIGURG      16,23,21    Ign    Urgent condition on socket (4.2BSD)
      SIGVTALRM  26,26,28    Term    Virtual alarm clock (4.2BSD)
      SIGXCPU    24,24,30    Core    CPU time limit exceeded (4.2BSD)
      SIGXFSZ    25,25,31    Core    File size limit exceeded (4.2BSD)

      Up  to  and including Linux 2.2, the default behavior for SIGSYS, SIGX鈥�
      CPU, SIGXFSZ, and (on architectures other than SPARC and  MIPS)  SIGBUS
      was  to  terminate  the  process (without a core dump).  (On some other
      UNIX systems the default action for SIGXCPU and SIGXFSZ is to terminate
      the  process  without  a  core  dump.)  Linux  2.4  conforms  to  the
      POSIX.1-2001 requirements for these signals,  terminating  the  process
      with a core dump.

      Next various other signals.

      Signal      Value    Action  Comment
      鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€
      SIGIOT        6        Core    IOT trap. A synonym for SIGABRT
      SIGEMT      7,-,7      Term
      SIGSTKFLT    -,16,-    Term    Stack fault on coprocessor (unused)
      SIGIO      23,29,22    Term    I/O now possible (4.2BSD)
      SIGCLD      -,-,18    Ign    A synonym for SIGCHLD
      SIGPWR      29,30,19    Term    Power failure (System V)
      SIGINFO      29,-,-            A synonym for SIGPWR
      SIGLOST      -,-,-      Term    File lock lost
      SIGWINCH    28,28,20    Ign    Window resize signal (4.3BSD, Sun)
      SIGUNUSED    -,31,-    Core    Synonymous with SIGSYS

      (Signal 29 is SIGINFO / SIGPWR on an alpha but SIGLOST on a sparc.)

      SIGEMT  is  not  specified in POSIX.1-2001, but nevertheless appears on
      most other UNIX systems, where its default action is typically to  ter鈥�
      minate the process with a core dump.

      SIGPWR (which is not specified in POSIX.1-2001) is typically ignored by
      default on those other UNIX systems where it appears.

      SIGIO (which is not specified in POSIX.1-2001) is ignored by default on
      several other UNIX systems.

      Where  defined,  SIGUNUSED  is synonymous with SIGSYS on most architec鈥�
      tures.

  Real-time Signals
      Linux supports real-time signals as originally defined in the  POSIX.1b
      real-time  extensions (and now included in POSIX.1-2001).  The range of
      supported real-time signals is  defined  by  the  macros  SIGRTMIN  and
      SIGRTMAX.  POSIX.1-2001  requires  that  an  implementation support at
      least _POSIX_RTSIG_MAX (8) real-time signals.

      The Linux kernel supports a range of 32  different  real-time  signals,
      numbered  33  to  64.  However, the glibc POSIX threads implementation
      internally uses two (for NPTL) or three  (for  LinuxThreads)  real-time
      signals  (see  pthreads(7)), and adjusts the value of SIGRTMIN suitably
      (to 34 or 35).  Because the range of available real-time signals varies
      according to the glibc threading implementation (and this variation can
      occur at run time according to the available  kernel  and  glibc),  and
      indeed  the range of real-time signals varies across UNIX systems, pro鈥�
      grams should never refer to real-time signals using hard-coded numbers,
      but instead should always refer to real-time signals using the notation
      SIGRTMIN+n, and include suitable (run-time) checks that SIGRTMIN+n does
      not exceed SIGRTMAX.

      Unlike standard signals, real-time signals have no predefined meanings:
      the entire set of real-time signals can be used for application-defined
      purposes.

      The  default  action  for an unhandled real-time signal is to terminate
      the receiving process.

      Real-time signals are distinguished by the following:

      1.  Multiple instances of real-time signals can  be  queued.  By  con鈥�
          trast,  if  multiple  instances  of a standard signal are delivered
          while that signal is currently blocked, then only one  instance  is
          queued.

      2.  If  the  signal  is  sent  using sigqueue(3), an accompanying value
          (either an integer or a pointer) can be sent with the  signal.  If
          the  receiving  process establishes a handler for this signal using
          the SA_SIGINFO flag to sigaction(2) then it can  obtain  this  data
          via  the  si_value  field  of the siginfo_t structure passed as the
          second argument to the handler.  Furthermore, the si_pid and si_uid
          fields  of  this  structure  can be used to obtain the PID and real
          user ID of the process sending the signal.

      3.  Real-time signals are delivered in a  guaranteed  order.  Multiple
          real-time  signals of the same type are delivered in the order they
          were sent.  If different real-time signals are sent to  a  process,
          they  are  delivered  starting  with  the  lowest-numbered  signal.
          (I.e., low-numbered signals have highest priority.)  By  contrast,
          if  multiple  standard signals are pending for a process, the order
          in which they are delivered is unspecified.

      If both standard and real-time signals are pending for a process, POSIX
      leaves it unspecified which is delivered first.  Linux, like many other
      implementations, gives priority to standard signals in this case.

      According  to  POSIX,  an  implementation  should  permit  at  least
      _POSIX_SIGQUEUE_MAX  (32)  real-time signals to be queued to a process.
      However, Linux does things differently.  In kernels up to and including
      2.6.7,  Linux imposes a system-wide limit on the number of queued real-
      time signals for all processes.  This limit can  be  viewed  and  (with
      privilege)  changed via the /proc/sys/kernel/rtsig-max file.  A related
      file, /proc/sys/kernel/rtsig-nr, can be used to find out how many real-
      time  signals are currently queued.  In Linux 2.6.8, these /proc inter鈥�
      faces were replaced by  the  RLIMIT_SIGPENDING  resource  limit,  which
      specifies  a  per-user  limit  for queued signals; see setrlimit(2) for
      further details.

  Async-signal-safe functions
      A signal handler function must be very careful, since processing  else鈥�
      where  may  be  interrupted at some arbitrary point in the execution of
      the program.  POSIX has the concept of “safe function”.  If  a  signal
      interrupts  the  execution  of an unsafe function, and handler calls an
      unsafe function, then the behavior of the program is undefined.

      POSIX.1-2004 (also  known  as  POSIX.1-2001  Technical  Corrigendum  2)
      requires  an  implementation  to guarantee that the following functions
      can be safely called inside a signal handler:

          _Exit()
          _exit()
          abort()
          accept()
          access()
          aio_error()
          aio_return()
          aio_suspend()
          alarm()
          bind()
          cfgetispeed()
          cfgetospeed()
          cfsetispeed()
          cfsetospeed()
          chdir()
          chmod()
          chown()
          clock_gettime()
          close()
          connect()
          creat()
          dup()
          dup2()
          execle()
          execve()
          fchmod()
          fchown()
          fcntl()
          fdatasync()
          fork()
          fpathconf()
          fstat()
          fsync()
          ftruncate()
          getegid()
          geteuid()
          getgid()
          getgroups()
          getpeername()
          getpgrp()
          getpid()
          getppid()
          getsockname()
          getsockopt()
          getuid()
          kill()
          link()
          listen()
          lseek()
          lstat()
          mkdir()
          mkfifo()
          open()
          pathconf()
          pause()
          pipe()
          poll()
          posix_trace_event()
          pselect()
          raise()
          read()
          readlink()
          recv()
          recvfrom()
          recvmsg()
          rename()
          rmdir()
          select()
          sem_post()
          send()
          sendmsg()
          sendto()
          setgid()
          setpgid()
          setsid()
          setsockopt()
          setuid()
          shutdown()
          sigaction()
          sigaddset()
          sigdelset()
          sigemptyset()
          sigfillset()
          sigismember()
          signal()
          sigpause()
          sigpending()
          sigprocmask()
          sigqueue()
          sigset()
          sigsuspend()
          sleep()
          sockatmark()
          socket()
          socketpair()
          stat()
          symlink()
          sysconf()
          tcdrain()
          tcflow()
          tcflush()
          tcgetattr()
          tcgetpgrp()
          tcsendbreak()
          tcsetattr()
          tcsetpgrp()
          time()
          timer_getoverrun()
          timer_gettime()
          timer_settime()
          times()
          umask()
          uname()
          unlink()
          utime()
          wait()
          waitpid()
          write()

      POSIX.1-2008 removes fpathconf(), pathconf(), and  sysconf()  from  the
      above list, and adds the following functions:

          execl()
          execv()
          faccessat()
          fchmodat()
          fchownat()
          fexecve()
          fstatat()
          futimens()
          linkat()
          mkdirat()
          mkfifoat()
          mknod()
          mknodat()
          openat()
          readlinkat()
          renameat()
          symlinkat()
          unlinkat()
          utimensat()
          utimes()

  Interruption of System Calls and Library Functions by Signal Handlers
      If  a signal handler is invoked while a system call or library function
      call is blocked, then either:

      * the call is automatically restarted after the signal handler returns;
        or

      * the call fails with the error EINTR.

      Which  of  these  two  behaviors  occurs  depends  on the interface and
      whether or not the signal handler was established using the  SA_RESTART
      flag  (see sigaction(2)).  The details vary across UNIX systems; below,
      the details for Linux.

      If a blocked call to one of the following interfaces is interrupted  by
      a  signal  handler, then the call will be automatically restarted after
      the signal handler returns if the SA_RESTART flag was  used;  otherwise
      the call will fail with the error EINTR:

          * read(2),  readv(2),  write(2),  writev(2),  and ioctl(2) calls on
            “slow” devices.  A “slow” device is one where the  I/O  call  may
            block  for  an indefinite time, for example, a terminal, pipe, or
            socket.  (A disk is not a slow device according to  this  defini鈥�
            tion.)  If  an I/O call on a slow device has already transferred
            some data by the time it is interrupted by a signal handler, then
            the  call  will  return a success status (normally, the number of
            bytes transferred).

          * open(2), if  it  can  block  (e.g.,  when  opening  a  FIFO;  see
            fifo(7)).

          * wait(2), wait3(2), wait4(2), waitid(2), and waitpid(2).

          * Socket  interfaces:  accept(2), connect(2), recv(2), recvfrom(2),
            recvmsg(2), send(2), sendto(2), and sendmsg(2), unless a  timeout
            has been set on the socket (see below).

          * File locking interfaces: flock(2) and fcntl(2) F_SETLKW.

          * POSIX  message  queue  interfaces:  mq_receive(3),  mq_time鈥�
            dreceive(3), mq_send(3), and mq_timedsend(3).

          * futex(2)  FUTEX_WAIT  (since  Linux  2.6.22;  beforehand,  always
            failed with EINTR).

          * POSIX  semaphore  interfaces:  sem_wait(3)  and  sem_timedwait(3)
            (since Linux 2.6.22; beforehand, always failed with EINTR).

      The following interfaces are never restarted after being interrupted by
      a signal handler, regardless of the use of SA_RESTART; they always fail
      with the error EINTR when interrupted by a signal handler:

          * Socket interfaces, when a timeout has  been  set  on  the  socket
            using  setsockopt(2):  accept(2),  recv(2),  recvfrom(2),  and
            recvmsg(2), if a receive timeout (SO_RCVTIMEO) has been set; con鈥�
            nect(2),  send(2),  sendto(2),  and sendmsg(2), if a send timeout
            (SO_SNDTIMEO) has been set.

          * Interfaces used to wait  for  signals:  pause(2),  sigsuspend(2),
            sigtimedwait(2), and sigwaitinfo(2).

          * File    descriptor    multiplexing  interfaces:  epoll_wait(2),
            epoll_pwait(2), poll(2), ppoll(2), select(2), and pselect(2).

          * System V IPC interfaces: msgrcv(2), msgsnd(2), semop(2), and sem鈥�
            timedop(2).

          * Sleep    interfaces:    clock_nanosleep(2),  nanosleep(2),  and
            usleep(3).

          * read(2) from an inotify(7) file descriptor.

          * io_getevents(2).

      The sleep(3) function is also never restarted if interrupted by a  han鈥�
      dler,  but  gives  a success return: the number of seconds remaining to
      sleep.

  Interruption of System Calls and Library Functions by Stop Signals
      On Linux, even in the absence  of  signal  handlers,  certain  blocking
      interfaces  can  fail with the error EINTR after the process is stopped
      by one of the stop signals and then resumed via SIGCONT.  This behavior
      is not sanctioned by POSIX.1, and doesn’t occur on other systems.

      The Linux interfaces that display this behavior are:

          * Socket  interfaces,  when  a  timeout  has been set on the socket
            using  setsockopt(2):  accept(2),  recv(2),  recvfrom(2),  and
            recvmsg(2), if a receive timeout (SO_RCVTIMEO) has been set; con鈥�
            nect(2), send(2), sendto(2), and sendmsg(2), if  a  send  timeout
            (SO_SNDTIMEO) has been set.

          * epoll_wait(2), epoll_pwait(2).

          * semop(2), semtimedop(2).

          * sigtimedwait(2), sigwaitinfo(2).

          * read(2) from an inotify(7) file descriptor.

          * Linux  2.6.21 and earlier: futex(2) FUTEX_WAIT, sem_timedwait(3),
            sem_wait(3).

          * Linux 2.6.8 and earlier: msgrcv(2), msgsnd(2).

          * Linux 2.4 and earlier: nanosleep(2).

CONFORMING TO
      POSIX.1, except as noted.

BUGS
      SIGIO and SIGLOST have the same value.  The latter is commented out  in
      the  kernel source, but the build process of some software still thinks
      that signal 29 is SIGLOST.

SEE ALSO
      kill(1),  getrlimit(2),  kill(2),  killpg(2),    rt_sigqueueinfo(2),
      setitimer(2),  setrlimit(2), sgetmask(2), sigaction(2), sigaltstack(2),
      signal(2), signalfd(2), sigpending(2),  sigprocmask(2),  sigsuspend(2),
      sigwaitinfo(2),    abort(3),  bsd_signal(3),  longjmp(3),  raise(3),
      pthread_sigqueue(3), sigqueue(3), sigset(3),  sigsetops(3),  sigvec(3),
      sigwait(3),    strsignal(3),    sysv_signal(3),    core(5),    proc(5),
      pthreads(7), sigevent(7)

COLOPHON
      This page is part of release 3.35 of the Linux  man-pages  project.  A
      description  of  the project, and information about reporting bugs, can
      be found at http://man7.org/linux/man-pages/.

 

Linux                            2011-09-18                        SIGNAL(7)

本文永久更新链接地址:http://www.linuxidc.com/Linux/2015-07/120632.htm

赞(0) 打赏
转载请注明出处:服务器评测 » 浅析 Linux/UNIX 信号机制
分享到: 更多 (0)

听说打赏我的人,都进福布斯排行榜啦!

支付宝扫一扫打赏

微信扫一扫打赏