SIGSTOP 和 SIGTSTP 有什么区别?

只是想知道 SIGSTOPSIGTSTP信号之间的区别。

77312 次浏览

这两个信号的目的是暂停一个进程,最终将恢复与 SIGCONT。它们之间的主要区别是:

  • SIGSTOP是以编程方式发送的信号(例如: kill -STOP pid) ,而 SIGTSTP(用于 < em > signal-T终端 )也可以通过键盘上的用户(通常是 Control-Z)通过 tty驱动程序发送。

  • 不能忽略 SIGSTOP。可以忽略 SIGTSTP

根据 /usr/include/x86_64-linux-gnu/bits/signum.h档案,存在以下情况:

#define SIGSTOP     19  /* Stop, unblockable (POSIX).  */
#define SIGTSTP     20  /* Keyboard stop (POSIX).  */

目标进程不能忽略 SIGSTOP。

一个很好的例子就是视频播放器 mpv,它可以忽略 SIGTSTP但不能忽略 SIGSTOP

你可以运行一个视频来进行测试:

kill -SIGTSTP $(pidof mpv) 还有 kill -SIGSTOP $(pidof mpv)

当然 kill -SIGCONT $(pidof mpv)继续播放。

在 Ubuntu,/usr/include/x86_64-linux-gnu/bits/signum-generic.h

#ifdef __USE_XOPEN
# define SIG_HOLD ((__sighandler_t) 2)  /* Add signal to hold mask.  */
#endif


/* We define here all the signal names listed in POSIX (1003.1-2008);
as of 1003.1-2013, no additional signals have been added by POSIX.
We also define here signal names that historically exist in every
real-world POSIX variant (e.g. SIGWINCH).


Signals in the 1-15 range are defined with their historical numbers.
For other signals, we use the BSD numbers.
There are two unallocated signal numbers in the 1-31 range: 7 and 29.
Signal number 0 is reserved for use as kill(pid, 0), to test whether
a process exists without sending it a signal.  */


/* ISO C99 signals.  */
#define SIGINT      2   /* Interactive attention signal.  */
#define SIGILL      4   /* Illegal instruction.  */
#define SIGABRT     6   /* Abnormal termination.  */
#define SIGFPE      8   /* Erroneous arithmetic operation.  */
#define SIGSEGV     11  /* Invalid access to storage.  */
#define SIGTERM     15  /* Termination request.  */


/* Historical signals specified by POSIX. */
#define SIGHUP      1   /* Hangup.  */
#define SIGQUIT     3   /* Quit.  */
#define SIGTRAP     5   /* Trace/breakpoint trap.  */
#define SIGKILL     9   /* Killed.  */
#define SIGBUS      10  /* Bus error.  */
#define SIGSYS      12  /* Bad system call.  */
#define SIGPIPE     13  /* Broken pipe.  */
#define SIGALRM     14  /* Alarm clock.  */


/* New(er) POSIX signals (1003.1-2008, 1003.1-2013).  */
#define SIGURG      16  /* Urgent data is available at a socket.  */
#define SIGSTOP     17  /* Stop, unblockable.  */
#define SIGTSTP     18  /* Keyboard stop.  */
#define SIGCONT     19  /* Continue.  */
#define SIGCHLD     20  /* Child terminated or stopped.  */
#define SIGTTIN     21  /* Background read from control terminal.  */
#define SIGTTOU     22  /* Background write to control terminal.  */
#define SIGPOLL     23  /* Pollable event occurred (System V).  */
#define SIGXCPU     24  /* CPU time limit exceeded.  */
#define SIGXFSZ     25  /* File size limit exceeded.  */
#define SIGVTALRM   26  /* Virtual timer expired.  */
#define SIGPROF     27  /* Profiling timer expired.  */
#define SIGUSR1     30  /* User-defined signal 1.  */
#define SIGUSR2     31  /* User-defined signal 2.  */


在 macOS 上,执行命令 man signal读取信号文档。

# 姓名 默认行动 描述
17 SIGSTOP 停止进程 停止(不能被捕获或忽略)
18 SIGTSTP 停止进程 键盘产生的停止信号

它们之间有两个不同之处:

  • 可以捕捉或忽略 SIGTSTP,但不能捕捉或忽略 SIGSTOP
  • SIGTSTP可以由键盘生成(CTRL + Z) ,SIGSTOP不能。