signal信号相关资料

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值