处理信号

Linux使用信号与系统上运行的进程进行通信!系统和应用程序生成的信号有30多个,常见的如图:

信号 描述
1 SIGHUP 挂起进程
2 SIGINT 终端进程
3 SIGQUIT 停止进程
9 SIGKILL 无条件终止进程
15 SIGTERM 如果可能的话终止进程
17 SIGSTOP 无条件停止,但不终止进程
18 SIGTSTP 停止或暂停进程,但不终止进程
19 SIGCONT 重新启动停止的进程

默认情况下,bash shell会忽略它接收的任何SIGQUIT(3)和SIGTERM(15)信号。但是,bash shell会处理它收到的任何SIGHUP(1)和SIGINT(2)信号

生成信号:

bash shell可以使用键盘上的组合键,生成两个基本的Linux信号。若需要暂停或者停止,就可以派上用场!

  1. 中断进程(Ctrl+C)可以生成SIGINT信号
  2. 暂停进程(Ctrl+Z)可以生成SIGTSTP信号
    中断进程和暂停进程不同,暂停进程仍然保留在内存中,能够从停止的地方继续运行

[[email protected] ~]# sleep 5

[1]+  Stopped                 sleep 5

方括号[1]:数字1是shell分配的作业编号(job number)

[[email protected] ~]# ps au

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND

root      6904  0.0  0.0   4916  1520 pts/1    Ss   11:06   0:00 -bash

root      7548  0.0  0.0   3960   476 pts/1    T    15:34   0:00 sleep 5

root      7555  0.0  0.0   4504   936 pts/1    R+   15:38   0:00 ps au

ps命令将停止作业的状态显示为T,只需要再次键入exit命令,shell将退出,并终止停止作业!

还可以使用Kill命令终止它!

[[email protected] ~]# kill -9 7548

捕捉信号:

trap命令指定能够通过shell脚本监控和拦截linux信号。如果脚本收到trap命令中列出的信号,它将不被shell处理

trap命令格式:

trap commands signals

#!/bin/bash

trap "echo Haha" SIGINT SIGTERM

echo "This is a test program"

count=1

while [ $count -le 10 ]

do

echo "Loop #$count"

sleep 10

count=$[ $count +1 ]

done

echo "This is the end of the test program"

[[email protected] ~]# ./test48.sh

This is a test program

Loop #1

Loop #2

Loop #3

Loop #4

Haha

Loop #5

Haha

Loop #6

Haha

Loop #7

Haha

Loop #8

Haha

Loop #9

Haha

Loop #10

Haha

每次按Ctrl+C组合键时,脚本执行trap命令中指定的echo语句,显示“Haha ”


捕获脚本退出:

命令格式:trap command EXIT

#!/bin/bash

trap "echo byebye" EXIT

count=1

while [ $count -le 5 ]

do

echo "loop #$count"

sleep 3

count=$[ $count + 1 ]

done


[[email protected] ~]# ./test49.sh

loop #1

loop #2

loop #3

loop #4

loop #5

byebye


按Ctrl+C组合键时,出发trap命令


移除捕获:

要移除捕获,使用破折号作为命令和想要恢复正常行为的信号列表:

#!/bin/bash

trap "echo byebye" EXIT

count=1

while [ $count -le 5 ]

do

echo "loop #$count"

sleep 3

count=$[ $count + 1 ]

done

trap - EXIT

echo "I just removed the trap"

[[email protected] ~]# ./test49.sh

loop #1

loop #2

loop #3

loop #4

loop #5

I just removed the trap

时间: 2024-10-08 20:27:31

处理信号的相关文章

对AM信号FFT的matlab仿真

普通调幅波AM的频谱,大信号包络检波频谱分析 u(t)=Ucm(1+macos ?t)cos ?ct ma称为调幅系数 它的频谱由载波,上下边频组成 , 包络检波中二极管截去负半周再用电容低通滤波,可以得到基带信号,那么,截去负半周后的AM信号必定包含基带信号的频谱.我们可以通过matlab来验证. %已知基带信号为1hz,载波为64hz,调制系数ma=0.3,采样频率1024hz,FFT变换区间N为2048 clear; fs=1024; f=1; %1hz基带信号 fc=64; %64hz载

信号驱动和异步驱动的区别

5种I/O模型: 1.阻塞I/O 2.非阻塞I/O 3.异步I/O 4.信号驱动I/O 5.I/O复用 信号驱动和异步驱动的区别 信号驱动IO是指:进程预先告知内核,使得 当某个socketfd有events(事件)发生时,内核使用信号通知相关进程. 异步IO(Asynchronous IO)是指:进程执行IO系统调用(read / write)告知内核启动某个IO操作,内核启动IO操作后立即返回到进程.IO操作即内核当中的服务例程. 异步I/O和信号驱动I/O的区别很容易被混淆.前者与后者的区

第二十二篇:信号的接收和处理

前言 要想掌握 Linux 系统编程,自然要好好学学其信号机制. 本文介绍一个简单的信号接收处理程序,为后面继续深入学习信号机制打下基础. 什么是信号 信号是软件中断,它提供一种处理异步事件的方法. 信号产生的条件 1. 当用户按某些终端按键时.比如:Ctrl + D / Ctrl + C 等. 2. 硬件异常.比如:除数为 0,无效内存引用等. 3. 调用 kill 函数可以将信号发送给另一个进程或者进程组. 4. 当检测到某种软件条件已经发生时.比如:alarm 到时,网络传来某些带外数据时

第二十三篇:信号机制的两个思考

前言 前文介绍了最基本的信号接收和处理,但这有无可能带来一些问题呢? 本文将通过两个思考,来分析可能带来的问题以及解决方法. 思考一:中断的系统调用 如果用户正在执行系统调用,如 write read.如果这个时候程序跳转到了信号处理函数后返回,则是否重新执行这个系统调用? 结论 这要分情况讨论:如果是磁盘 I/O 的系统调用,则自然需要自动重启:而如果是终端 I/O,则不需要自动重启. 在信号函数族中,有很多函数都是支持设置是否重启选项的.当然,用户也可以使用类似下面的代码自行实现重启: 思考

python运维开发(二十)----models操作、中间件、缓存、信号、分页

内容目录 select Form标签数据库操作 models操作F/Q models多对多表操作 Django中间件 缓存 信号 分页 select Form标签补充 在上一节中我们可以知道Form标签有两个作用,一个做用户提交数据验证,一个是生成HTML标签 在生成HTML标签中可以生成select标签,select的选项数据我们可以在数据库中查询读取到. class UserType(models.Model): caption = models.CharField(max_length=1

Linux信号、信号处理和信号处理函数

信号(signal)是一种软件中断,它提供了一种处理异步事件的方法,也是进程间惟一的异步通信方式.在Linux系统中,根据POSIX标准扩展以后的信号机制,不仅可以用来通知某种程序发生了什么事件,还可以给进程传递数据. 一.信号的来源 信号的来源可以有很多种试,按照产生条件的不同可以分为硬件和软件两种. 1.  硬件方式 当用户在终端上按下某键时,将产生信号.如按下组合键后将产生一个SIGINT信号. 硬件异常产生信号:除数据.无效的存储访问等.这些事件通常由硬件(如:CPU)检测到,并将其通知

RACCommand中的信号

示例: RACSignal* textSignal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) { [subscriber sendNext:@(1)]; [subscriber sendNext:@(2)]; [subscriber sendError:[NSError new]]; return nil; }]; RACCommand* textCommad = [[RACCommand

【C/C++学院】(13)QT开发技术/QT 基础/QT 信号和槽

Qt是一个跨平台的c++图形用户界面用用程序框架. Qt安装说明: windows下环境变量path需要加入以下路径,以便QT写的程序可以离开QT开发环境独立运行 C:\Qt\Qt5.2.0\5.2.0\mingw48_32\bin\;C:\Qt\Qt5.2.0\Tools\mingw48_32\bin; linux下需要设置.bash_profile文件 PATH中加入/opt/Qt5.2.0/5.2.0/gcc/bin 用root用户登录系统,进入/usr/lib目录后执行 ln libGL

UNIX环境编程学习笔记(24)——信号处理进阶学习之信号集和进程信号屏蔽字

lienhua342014-11-03 1 信号传递过程 信号源为目标进程产生了一个信号,然后由内核来决定是否要将该信号传递给目标进程.从信号产生到传递给目标进程的流程图如图 1 所示, 图 1: 信号产生.传递到处理的流程图 进程可以阻塞信号的传递.当信号源为目标进程产生了一个信号之后,内核会执行依次执行下面操作, 1. 如果目标进程设置了忽略该信号,则内核直接将该信号丢弃. 2. 如果目标进程没有阻塞该信号,则内核将该信号传递给目标进程,由目标进程执行相对应操作. 3. 如果目标进程设置阻塞

Linux01-BASH脚本编程之信号捕捉及任务计划53

一.脚本编程知识点 1.获取变量中字符的长度:${#VARNAME} 2.变量赋值: a)${parameter:-word}:如果parameter为空或未定义,则变量展开为"word":否则,展开为parameter的值: 如:A=3 echo ${A:-30} unset A echo ${A:-30} b)${parameter:+word}:如果parameter为空或未定义,不做任何操作:否则,则展开为"word"值: 如:echo ${A:+30} A