77范文网 - 专业文章范例文档资料分享平台

在shell中捕捉信号的trap命令

来源:网络收集 时间:2021-09-24 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:或QQ: 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

在shell中捕捉信号的trap命令(转) 2008-12-03 14:54:28

分类: LINUX

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

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

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

(3)忽视这一信号

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

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

trap 'commands' signal-list

trap "commands" signal-list

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

trap signal-list

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

trap " " signal-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) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL

5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE

9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2

13) SIGPIPE 14) SIGALRM 15) SIGTERM 17) SIGCHLD

18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN

22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ

26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO

30) SIGPWR 31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1

36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4 39) SIGRTMIN+5

40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8 43) SIGRTMIN+9

44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13

48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13

52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9

56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6 59) SIGRTMAX-5

60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2 63) SIGRTMAX-1

64) SIGRTMAX

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

trap "" 1 2 3 24 或 trap "" HUP INT QUIT TSTP

用 trap :1 2 3 24 或 trap HUP INT QUIT TSTP使其回复默认值。

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

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

如:trap “echo 'GO Away'” INT

Unix信号处理学习笔记

(转自:/powervv/archive/2008/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进程,否则忽略此信号。

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

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

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

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

最后内核安排进程返回到用户态并执行信号句柄,同时保证句柄执行完时,进程从被中断处代码执行。

由异步事件产生的信号可能在任一条指令后发生,当信号句柄完成时,进程从中断之处起执行。如果信号是在进程处于系统调用期间到达的,内核通常abort此系统调用并返回错误码EINTR。

百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说英语学习在shell中捕捉信号的trap命令在线全文阅读。

在shell中捕捉信号的trap命令.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.77cn.com.cn/wenku/yingyu/1246168.html(转载请注明文章来源)
Copyright © 2008-2022 免费范文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ: 邮箱:tiandhx2@hotmail.com
苏ICP备16052595号-18
× 注册会员免费下载(下载后可以自由复制和排版)
注册会员下载
全站内容免费自由复制
注册会员下载
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: