这里有一些关于signals的questions和answers。重要的不是获得这些问题的正确答案,而是你从中可以学习到某些东西。
在Unix中可以使用哪个命令发送signals?
kill,你可以使用kill不仅可以发送杀死进程的信号,可以发送任何信号。比如:
$ kill -STOP 1234
这表示发送SIGSTOP
信号给PID为1234的程序。用来发送信号的系统调用也叫kill。
一个进程可以向其他任何进程发送信号么?
不可以!
要发送信号,两个进程需要在同一用户身份运行下(或者root用户)。否则,你可以杀死root用户运行的程序,这是很糟糕的!
当你运行kill PID时,该进程会发生什么?
该进程立即退出。
不带任何参数的kill
发送SIGTERM
信号。 进程获得SIGTERM
时的默认立即退出。
运行kill PID时,进程可以不退出吗?
可以!
任何进程都可以为特定信号设置信号处理程序功能(例如SIGINT
),即捕捉到该信号则执行处理函数中的步骤。也可以使用预定义的信号处理方式(例如SIG_IGN
表示“忽略”)或运行自定义函数。
为什么在终端中按Ctrl + C会终止前台进程?
它发送了一个信号!
在终端中按下Ctrl + C,内核将会发送SIGINT
信号到正在运行的前台进程。
运行kill -9 PID,该进程除了立即退出可以选择其他方式处理么?
不可以!
kill -9发送SIGKILL
信号,这个信号不能够被阻塞。这是一种让进程立即退出的好方法。SIGSTOP
信号也不能够被阻塞。
kill -9能保证一定杀死一个进程吗?
不能保证!
对一个进程进行kill -9,该进程不能捕获SIGKILL
信号,也不能被阻塞。但有时在Linux上,它们在执行I/O或其他操作时会卡住,无法杀死。 这种不可杀死的状态称为“不间断睡眠”。
向一个进程发送一个信号,进程会等待当前函数执行完么?
默认情况下不会!
默认情况下,信号不等待任何东西,它们在执行过程中的任意点中断该过程。如果你只想在方便处理的时候中断它,则可以将进程的信号掩码设置为阻止信号,然后在想要接收信号时运行sigwait
。
kill PID和Ctrl+C发送的信号相同么?
不相同!
kill PID发送的是SIGTERM
信号,但是Ctrl+C发送的是SIGINT
信号。
用SIGSTOP信号停止一个进程会导致该进程退出么?
不会!
停止一个进程就像按下了暂停键,该进程将被挂起,它停止使用CPU,但所有进程当前的状态保持不变。你可以稍后恢复它,它会在停下来的地方重新执行。如果你在终端中运行了某个程序(例如vim),则可以通过按Ctrl + Z向其发送SIGTSTP
(默认情况下,该程序也会被挂起)。
SIGSTOP和SIGTSTP的区别是什么?
两种信号都用于在停止进程,该进程可以通过SIGCONT
信号恢复。 它们之间的主要区别是:
SIGSTOP
,通常是用kill -STOP pid
的方式发送信号,而SIGTSTP
通常用键盘Ctrl + Z
来发送信号。SIGSTOP
信号不能阻塞,SIGTSTP
可以被阻塞。
信号除了杀死/停止进程,还有什么用途?
SIGUSR1
,SIGUSR2
和SIGHUP
默认情况下会终止进程,但是进程有时会使用这些信号来重新加载配置或打印出调试信息。 例如,如果向nginx
发送一个SIGHUP
,它将重新加载其配置。
参考: