(C++通讯架构学习笔记):信号的概念、认识、处理动作

目录

信号的基本概念

通过kill命令认识一些信号

进程的状态

常用的信号列举

信号处理的相关动作

信号的基本概念

  • 进程之间的常用通信手段:比如发送信号kill一个worker进程,master拉起一个新的worker进程 ,以及前面的 SIGHUP信号
  • 信号 :通知(事情通知),用来通知某个进程发生了某一个事情。
  • 事情,信号都是突发事件, 信号是异步发生的,信号也被称呼为“软中断”。

【信号如何产生】

  • 某个进程发送给另外一个进程或者发送给自己(如热升级)
  • 由内核(操作系统)发送给某个进程
    • 通过在键盘输入命令ctrl+c[中断信号],kill命令
    • 内存访问异常,除数为0等等,硬件都会检测到并且通知内核;
  • 信号名字,都是以SIG开头,如SIGHUP(终端断开信号)
  • UNIX以及类UNIX操作系统(linux,freebsd,solaris),支持的信号数量各不相同,10-60多个之间。
  • 信号既有名字,其实也都是一些数字,信号是一些正整数常量,信号就是宏定义(数字,从1开始)
    • #include <signal.h>(/usr/include/)
find / -name "signal.h" | xargs grep -in "SIGHUP"

cd /usr/include/asm/

vim signal.h
#define SIGHUP           1
#define SIGINT           2
#define SIGQUIT          3
#define SIGILL           4
#define SIGTRAP          5
#define SIGABRT          6
#define SIGIOT           6
#define SIGBUS           7
#define SIGFPE           8
#define SIGKILL          9
#define SIGUSR1         10
#define SIGSEGV         11
#define SIGUSR2         12
#define SIGPIPE         13
#define SIGALRM         14
#define SIGTERM         15
#define SIGSTKFLT       16
#define SIGCHLD         17
#define SIGCONT         18
#define SIGSTOP         19
#define SIGTSTP         20
#define SIGTTIN         21
#define SIGTTOU         22
#define SIGURG          23
#define SIGXCPU         24
#define SIGXFSZ         25
#define SIGVTALRM       26
#define SIGPROF         27
#define SIGWINCH        28
#define SIGIO           29
#define SIGPOLL         SIGIO

通过kill命令认识一些信号

  • kill :kill 进程id ,他的工作是发个信号给进程
  • kill能给进程发送多种信号
ps -eo pid,ppid,sid,tty,pgrp,comm | grep -E 'bash|PID|nginx'

  • 在另一个窗口进行监视
strace -e trace=signal -p 1184

  • 新开一个终端窗口

kill 1184
  • 在监视窗口中:

  • 如果你单纯的用kill 进程id,那么就是往进程发送SIGTERM信号(终止信号)
  • kill -数字 进程id,能发出跟这个数字对应的信号 
    • 如果我门用kill -1 进程id,那么就是往进程nginx发送SIGHUP终止信号;同时进程nginx就被终止掉了。
    • kill -2 进程id,发送SIGINT信号。

【kill 命令不同数字所能发出的不同信号】

kill的参数

该参数发出的信号

操作系统缺省动作

-1

SIGHUP(连接断开)

终止掉进程(进程没了)

-2

SIGINT(终端中断符,比如ctrl+c)

终止掉进程(进程没了)

-3

SIGQUIT(终端退出符,比如ctrl+\)

终止掉进程(进程没了)

-9

SIGKILL(终止)

终止掉进程(进程没了)

-18

SIGCONT(使暂停的进程继续)

忽略(进程依旧在运行不受影响)

-19

SIGSTOP(停止),可用SIGCONT继续,但任务被放到了后台

停止进程(不是终止,进程还在)

-20

SIGTSTP(终端停止符,比如ctrl+z),但任务被放到了后台,可用SIGCONT继续

停止进程(不是终止,进程还在)

进程的状态

【查看进程状态的方式】

ps -eo pid,ppid,sid,tty,pgrp,comm,stat | grep -E 'bash|PID|nginx'

  • 或者使用   
ps aux | grep -E 'bash|PID|nginx'    //aux所谓BSD风格显示格式;

【进程状态】

状态

含义

D

不可中断的休眠状态(通常是I/O的进程),可以处理信号,有 延迟

R

可执行状态&运行状态(在运行队列里的状态)

S

可中断的休眠状态之中(等待某事件完成),可以处理信号

T

停止或被追踪(被作业控制信号所停止)

Z

僵尸进程

X

死掉的进程

<

高优先级的进程

N

低优先级的进程

L

有些页被锁进内存

s

Session leader(进程的领导者),在它下面有子进程

t

追踪期间被调试器所停止

+

位于前台的进程组

常用的信号列举

信号名

信号含义

SIGHUP(连接断开)

是终端断开信号,如果终端接口检测到一个连接断开,发送此信号到该终端所在的会话首进程(前面讲过),缺省动作会导致所有相关的进程退出(上节课也重点讲了这个信号,xshell断开就有这个信号送过来)

Kill -1 进程号也能发送此信号给进程;

SIGALRM(定时器超时)

一般调用系统函数alarm创建定时器,定时器超时了就会这个信号;

SIGINT(中断)

从键盘上输入ctrl+C(中断键)【比如你进程正跑着循环干一个事】,这一ctrl+C就能打断你干的事,终止进程;

但shell会将后台进程对该信号的处理设置为忽略(也就是说该进程若在后台运行则不会收到该信号)

SIGSEGV(无效内存)

内存访问异常,除数为0等,硬件会检测到并通知内核;其实这个SEGV代表段违例(segmentation violation),你有的时候运行一个你编译出来的可执行的c程序,如果内存有问题,执行的时候就会出现这个提示;

SIGIO(异步I/O

通用异步I/O信号,咱们以后学通讯的时候,如果通讯套接口上有数据到达,或发生一些异步错误,内核就会通知我们这个信号;

SIGCHLD(子进程改变)

一个进程终止或者停止时,这个信号会被发送给父进程;(我们想象下nginxworker进程终止时 master进程应该会收到内核发出的针对该信号的通知);

SIGUSR1,SIGUSR2(都是用户定义信号)

用户定义的信号,可用于应用程序,用到再说;

SIGTERM(终止)

一般你通过在命令行上输入kill命令来杀一个进程的时候就会触发这个信号,收到这个信号后,你有机会退出前的处理,实现这种所谓优雅退出的效果;

SIGKILL(终止)

不能被忽略,这是杀死任意进程的可靠方法,不能被进程本身捕捉

SIGSTOP(停止)

不能被忽略,使进程停止运行,可以用SIGCONT继续运行,但进程被放入到了后台

SIGQUIT(终端退出符)

从键盘上按ctrl+\

但shell会将后台进程对该信号的处理设置为忽略(也就是说该进程若在后台运行则不会收到该信号)

SIGCONT(使暂停进程继续)

使暂停的进程继续运行

SIGTSTP(终端停止符)

从键盘上按ctrl+z,进程被停止,并被放入后台,可以用SIGCONT继续运行

信号处理的相关动作

  • 当某个信号出现时,我们可以按三种方式之一进行处理,我们称之为信号的处理或者与信号相关的动作
    • 执行系统默认动作 ,绝大多数信号的默认动作是杀死该个进程
    • 忽略此信号(但是不包括SIGKILL和SIGSTOP)
      • kill -9 进程id,是一定能够把这个进程杀掉的;
signal(SIGHUP,SIG_IGN);  //我收到这个信号后,请操作系统不要干掉我;
    • 捕捉该信号:写个处理函数,信号来的时候,就用处理函数来处理;(但是不包括SIGKILL和SIGSTOP)
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值