2023年在shell中捕捉信号的trap命令_第1页
2023年在shell中捕捉信号的trap命令_第2页
2023年在shell中捕捉信号的trap命令_第3页
2023年在shell中捕捉信号的trap命令_第4页
2023年在shell中捕捉信号的trap命令_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第在shell中捕捉信号的trap命令

在shell中捕捉信号的trap命令(转)202x-12-0314:54:28

分类:LINUx

一、trap捕捉到信号之后,可以有三种反应方式:

(1)执行一段程序来处理这一信号

(2)接受信号的默认操作

(3)忽视这一信号

二、trap对上面三种方式提供了三种基本形式:

第一种形式的trap命令在shell接收到signallist清单中数值相同的信号时,将执行双引号中的命令串。

trap'commands'signal-list

trapcommandssignal-list

为了恢复信号的默认操作,使用第二种形式的trap命令:

trapsignal-list

第三种形式的trap命令允许忽视信号

trapsignal-list

三、注意:

(1)对信号11(段违例)不能捕捉,因为shell本身需要捕捉该信号去进行内存的转储。

(2)在trap中可以定义对信号0的处理(实际上没有这个信号),shell程序在其终止(如执行exit语句)时发出该信号。

(3)在捕捉到signal-list中指定的信号并执行完相应的命令之后,如果这些命令没有

将shell程序终止的话,shell程序将继续执行收到信号时所执行的命令后面的命令,这样将很容易导致shell程序无法终止。

另外,在trap语句中,单引号和双引号是不同的,当shell程序第一次碰到trap语句时,将把commands中的命令扫描一遍。此时若commands是用单引号括起来的话,那么shell不会

对commands中的变量和命令进行替换,否则commands中的变量和命令将用当时具体的值来替换。

四、例子:忽略Ctrl+C:

在有些情况下,我们不希望自己的shell脚本在运行时刻被中断,比如说我们写得shell脚本设为某一用户的默认shell,使这一用户进入系统后只能作某一项工作,如数据库备份,我们可不希望用户使用ctrl+C之类便进入到shell状态,做我们不希望做的事情。这便用到了信号处理。

kill-l可以列出系统的信号名称,如下:

-bash-3.00#kill-l

1)SIGHUP2)SIGINT3)SIGQUIT4)SIGILL

5)SIGTRAP6)SIGABRT7)SIGBUS8)SIGFPE

9)SIGKILL10)SIGUSR111)SIGSEGV12)SIGUSR2

13)SIGPIPE14)SIGALRM15)SIGTERM17)SIGCHLD

18)SIGCONT19)SIGSTOP20)SIGTSTP21)SIGTTIN

22)SIGTTOU23)SIGURG24)SIGxCPU25)SIGxFSZ

26)SIGVTALRM27)SIGPROF28)SIGWINCH29)SIGIO

30)SIGPWR31)SIGSYS34)SIGRTMIN35)SIGRTMIN+1

36)SIGRTMIN+237)SIGRTMIN+338)SIGRTMIN+439)SIGRTMIN+5

40)SIGRTMIN+641)SIGRTMIN+742)SIGRTMIN+843)SIGRTMIN+9

44)SIGRTMIN+1045)SIGRTMIN+1146)SIGRTMIN+1247)SIGRTMIN+13

48)SIGRTMIN+1449)SIGRTMIN+1550)SIGRTMAx-1451)SIGRTMAx-13

52)SIGRTMAx-1253)SIGRTMAx-1154)SIGRTMAx-1055)SIGRTMAx-9

56)SIGRTMAx-857)SIGRTMAx-758)SIGRTMAx-659)SIGRTMAx-5

60)SIGRTMAx-461)SIGRTMAx-362)SIGRTMAx-263)SIGRTMAx-1

64)SIGRTMAx

通常我们需要忽略的信号有四个,即:HUP,INT,QUIT,TSTP,也就是信号1,2,3,24使用这样的语句可以使这些中断信号被忽略:

trap12324或trapHUPINTQUITTSTP

用trap:12324或trapHUPINTQUITTSTP使其回复默认值。

用stty-a可以列出中断信号与键盘的对应,分别执行上面的命令后,运行

tail-f/etc/passwd,然后尝试用键盘中断,试试两种情况(默认和忽略)下有何不同。更方便的是我们可以用在shell中用trap定义我们自己的信号处理程序,就象在c中用signal一样,

如:trap“echo'GOAway'”INT

Unix信号处理学习笔记

(转自:/powervv/archive/202x/06/30/54934.html)

信号是传送给进程的一种事件通知,生成信号的事件有三大类:

1.程序错误:除零,非法内存访问…

2.外部信号:终端Ctrl-C产生SGINT信号,定时器到期产生SIGALRM…

3.显示请求:kill函数允许进程发送任何信号给其他进程或进程组。

信号生成既可以是同步的(信号与程序中的某个具体操作相关并在那个操作同时产生),也可以是异步的。通常程序错误生成信号为同步的,进程显式请求给自己的信号也是同步的。外部事件总是异步的,来自其他进程的显示请求也是异步的。

信号发生时,我们可以告诉unix内核采取下面三种动作中的任一种:

1.忽略信号:大部分信号可被忽略,除SIGSTOP和SIGKILL信号外(这是超级用户杀掉或停掉任意进程的手段)。

2.捕获信号:注册信号处理函数,它对产生的特定信号做处理。

3.让信号默认动作起作用:unix内核定义的默认动作,有5种情况:

a)流产abort:终止进程并产生core文件。

b)终止stop:终止进程但不生成core文件。

c)忽略:忽略信号。

d)挂起suspend:挂起进程。

e)继续continue:若进程是挂起的,则resume进程,否则忽略此信号。

任意时刻,进程可以为信号指定动作。

信号处理涉及两个过程,生成与交付。

信号生成出现在事件发生时,此时内核检查接收进程的相关数据结构,此结构中记录了信号的布局,悬挂信号集和处理动作。如果信号是要被忽略的,内核不做任何动作就返回。否则,将此信号加入悬挂信号集合中。(悬挂信号集合通常用位串表示,每位对应一个信号,内核无法记录同一信号的多个实例)。

如果进程处于可中断的睡眠状态,并且该信号非阻塞,内核唤醒进程。被唤醒进程一旦运行则在返回用户态前优先处理悬挂信号,当有悬挂信号并且非阻塞时,内核查看是否有处理句柄,如果没有注册句柄,则采取默认

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论