扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:蓝色键盘 来源:天极论坛 2007年10月28日
关键字: Linux
在shell中,使用trap语句为信号设置新的陷阱。当shell 捕获到一个信号时(信号11除外,因为shell本身要利用这个信号进行内存分配),它将这个信号传递给所有当前正在执行的程序(父程序和子程序),并分别执行父程序和子程序中已设置的信号陷阱。一旦陷阱程序执行结束,便返 回中断点,继续执行原来的程序流程。
trap语句的基本格式:
trap command_list signal_list
command_list: 由一个或多个命令(或命令组)构成的命令列表。当命令列表中含有多个命令时要用单引号或双引号括起来,并且各命令间要用分号隔开。
signal_list:由一个或多个信号值构成的信号列表,各信号值间要用空格分开。
在一个shell程序(父程序)中重新设置信号的陷阱并不改变被这个程序所调用的子程序中同名信号的陷阱。同样,在子程序中设置的信号陷阱也不影响父程序中同名信号的陷阱。
shell在读取trap语句时,要扫描一次命令列表,以便设置陷阱。在捕获信号后,shell再次扫描命令 列表,执行已设置好的陷阱程序(命令或命令组)。因此,如果命令列表中含有变量置换或命令置换表达 式,shell在第一次扫描命令列表时就会用当前的变量值或命令结果置换这些表达式,使得在捕获到信号而 去执行陷阱程序时,陷阱程序已经不是原来设置的陷阱程序了。为了避免这种情况发生,使用单引号而不是 使用双引号把trap语句中含有变量置换或命令置换表达式的命令列表括起来;因为单引号可以消除所有字符 的特殊含义,这样避免了shell在第一次扫描时执行任何置换或替代操作,直到命令列表被执行时才进行置换或替代。
向一个程序或进程传递信号方法很多,比如在程序执行时按下Ctrl+c键或Del键,将向程序传递一个SIGINT信号,执行该信号的系统陷阱将终止程序执行。使用kill命令传递信号是shell语言编程中最为常用 的方法。
kill命令的基本格式是:
kill [ - signal ] PID
通常kill命令用来终止一个进程。但如果使用了带有短划线“-”的信号作为参数时,kill命令就发送 该信号给PID指示的一个或多个进程,而不是终止进程。当trap语句捕获到这个信号后便执行设定的信号陷程序,实现进程间的相互通讯。
下面的例子显示了程序master和slave1、slave2间如何利用信号机制实现相互通讯的。首先在后台运行 程序slave1和slave2,然后运行程序master。在文件/tmp/pro_list中记录了这三个程序的进程号。
程序slave1首先设置信号15的陷阱,然后把自己的当前进程写入文件/tmp/pro_list;在获得master进号后,进入循环状态。当接收到master发出的信号15时,执行陷阱程序,显示相关信息后,向master发出信15。
程序slave2执行情况与slave1相似。
程序master也是首先设置信号15的陷阱,然后把自己的当前进程写入文件/tmp/pro_list。在取得所有 slave程序进程号后,向这些slave程序发出信号15,然后进入循环等待。当接收到slave1或slave2发出的信 br> 号15时,执行陷阱程序,显示相关信息,杀死所有slave进程,清空文件/tmp/pro_list,然后退出。
程序/tmp/slave1: 程序/tmp/slave2: 程序/tmp/master: 执行程序: |
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者