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