https://blog.csdn.net/fz_ywj/article/details/9124401
SIGQUIT、SIGTERM、SIGINT、SIGKILL区别:
1. SIGQUIT:
在POSIX兼容的平台,SIGQUIT是其控制终端发送到进程,当用户请求的过程中执行核心转储的信号。 SIGQUIT通常可以ctrl+ \。在Linux上,人们还可以使用Ctrl-4或虚拟控制台,SysRq yek。
2. SIGTERM:
SIGTERM是杀或的killall命令发送到进程默认的信号。它会导致一过程的终止,但是SIGKILL信号不同,它可以被捕获和解释(或忽略)的过程。因此,SIGTERM类似于问一个进程终止可好,让清理文件和关闭。因为这个原因,许多Unix系统关机期间,初始化问题SIGTERM到所有非必要的断电过程中,等待几秒钟,然后发出SIGKILL强行终止仍然存在任何这样的过程。
3. SIGINT:
符合POSIX平台,信号情报是由它的控制终端,当用户希望中断该过程发送到处理的信号。通常ctrl-C,但在某些系统上,“删除”字符或“break”键 - 当进程的控制终端的用户按下中断正在运行的进程的关键SIGINT被发送。
4. SIGKILL:
上符合POSIX平台上,SIGKILL是发送到处理的信号以使其立即终止。当发送到程序,SIGKILL使其立即终止。在对比SIGTERM和SIGINT,这个信号不能被捕获或忽略,并且在接收过程中不能执行任何清理在接收到该信号。
查看Linux signal 信号定义,一共64个.
kill -l
The first 31 signals in Linux/i386 | ||||
# | Signal name | Default action | Comment | POSIX |
1 | SIGHUP | Terminate | Hang up controlling terminal or process | Yes |
2 | SIGINT | Terminate | Interrupt from keyboard | Yes |
3 | SIGQUIT | Dump | Quit from keyboard | Yes |
4 | SIGILL | Dump | Illegal instruction | Yes |
5 | SIGTRAP | Dump | Breakpoint for debugging | No |
6 | SIGABRT | Dump | Abnormal termination | Yes |
6 | SIGIOT | Dump | Equivalent to SIGABRT | No |
7 | SIGBUS | Dump | Bus error | No |
8 | SIGFPE | Dump | Floating-point exception | Yes |
9 | SIGKILL | Terminate | Forced-process termination | Yes |
10 | SIGUSR1 | Terminate | Available to processes | Yes |
11 | SIGSEGV | Dump | Invalid memory reference | Yes |
12 | SIGUSR2 | Terminate | Available to processes | Yes |
13 | SIGPIPE | Terminate | Write to pipe with no readers | Yes |
14 | SIGALRM | Terminate | Real-timerclock | Yes |
15 | SIGTERM | Terminate | Process termination | Yes |
16 | SIGSTKFLT | Terminate | Coprocessor stack error | No |
17 | SIGCHLD | Ignore | Child process stopped or terminated, or got signal if traced | Yes |
18 | SIGCONT | Continue | Resume execution, if stopped | Yes |
19 | SIGSTOP | Stop | Stop process execution | Yes |
20 | SIGTSTP | Stop | Stop process issued from tty | Yes |
21 | SIGTTIN | Stop | Background process requires input | Yes |
22 | SIGTTOU | Stop | Background process requires output | Yes |
23 | SIGURG | Ignore | Urgent condition on socket | No |
24 | SIGXCPU | Dump | CPU time limit exceeded | No |
25 | SIGXFSZ | Dump | File size limit exceeded | No |
26 | SIGVTALRM | Terminate | Virtual timer clock | No |
27 | SIGPROF | Terminate | Profile timer clock | No |
28 | SIGWINCH | Ignore | Window resizing | No |
29 | SIGIO | Terminate | I/O now possible | No |
29 | SIGPOLL | Terminate | Equivalent to SIGIO | No |
30 | SIGPWR | Terminate | Power supply failure | No |
31 | SIGSYS | Dump | Bad system call | No |
31 | SIGUNUSED | Dump | Equivalent to SIGSYS | No |
signal 使用教程。
信号分成两种:
regular signal(非实时信号),对应的编码值为[1,31]
real time signal对应的编码值为[32,64]
编码为0的信号不是有效信号,只用于检查是当前进程否有发送信号的权限,并不真正发送。
线程会有自己的悬挂信号队列, 并且线程组也有一个信号悬挂队列.
信号悬挂队列保存task实例接收到的信号,只有当该信号被处理后它才会从悬挂队列中卸下.
信号悬挂队列还有一个对应的阻塞信号集合,当一个信号在阻塞信号集合中时,task不会处理该被阻塞的信号(但是该信号依旧在悬挂队列中). 当阻塞取消时,它会被处理.
对一个信号,要三种处理方式:
1.忽略该信号(Ignore);//对应SIG_IGN
2.采用默认方式处理(调用系统指定的信号处理函数,default);//对应SIG_DFL
3.使用用户指定的方式处理(调用用户指定的信号处理函数).
signal()函数详解 void (*signal (int sig ,void (*func)(int))) (int) ;
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
signal函数
作用1:站在应用程序的角度,注册一个信号处理函数
作用2:忽略信号,设置信号默认处理 信号的安装和回复
参数
--signal是一个带signum和handler两个参数的函数.
准备捕捉或屏蔽的信号由参数signum给出,通过kill -l查看一共64个。
接收到指定信号时将要调用的函数有handler给出
--handler这个函数必须有一个int类型的参数(即接收到的信号代码),它本身的类型是void
--handler也可以是下面两个特殊值:
① SIG_IGN 屏蔽该信号
② SIG_DFL 恢复默认行为
1.SIG_IGN
#include <stdio.h>
#include <signal.h>
int main(int argc , char *argv[])
{
signal(SIGINT,SIG_IGN);
for(;;);
return 0;
}
gcc 命令编译后运行,按下ctrl+C有没有发现无法终止程序?
网上有人说用Ctrl+\来终止,我的系统是CentOS7,ctrl+\无效,倒是Ctrl+z可终止程序。
2.SIG_DFL
#include <stdio.h>
#include <signal.h>
int main(int argc , char *argv[])
{
// signal(SIGINT,SIG_DFL);//此语句注释还是不注释,其结果都是一样的,系统默认Ctrl+C可终止。
for(;;);
return 0;
}
3.自定义信号处理方式
#include <stdio.h>
#include <signal.h>
typedef void(*signal_handler)(int);
void signal_handler_fun(int signal_num)
{
printf("signal num is %d\n",signal_num); //按下ctrl+C中断后,该值为2,其实就是SIGINT,kill -l可查看到。
}
int main(int argc,char * argv[])
{
signal_handler p_signal = signal_handler_fun;
signal(SIGINT,p_signal);
for(;;);
return 0;
}
gcc编译运行科查看结果,Ctrl+C组合键按下输出2,Ctrl+Z退出程序。
查看链接:https://blog.csdn.net/chenjianqi0502/article/details/78579541