您尚未登录。

#1 2013-03-14 13:20:15

依云
会员
所在地: a.k.a. 百合仙子
注册时间: 2011-08-21
帖子: 8,919
个人网站

shell 脚本中的信号处理

我希望 Ctrl-C 时执行一个 shell 函数,但是不要中断当前的命令,该怎么做?

键盘信号会发往哪些进程呢?

离线

#2 2013-03-14 14:30:01

自由建客
穷若韩信
所在地: 桂林市第六人民医院
注册时间: 2011-08-27
帖子: 250
个人网站

Re: shell 脚本中的信号处理

trap 命令用于登记信号处理命令。
我用的一个例子:

Init()
{
	trap "Exit 1" 1 2 3 9 11 15
	if [ -e "$LockFile" ]; then
		echo "Error: getmail.sh already running!" >&2
		exit 3
	fi
	>"$LockFile"
}

Exit()
{
	rm -f "$LockFile"
	exit $1
}

至于信号会发给哪些进程,比较复杂,参见《UNIX 环境高级编程》中「进程关系」一章。

最近编辑记录 自由建客 (2013-03-14 14:31:23)

离线

#3 2013-03-14 14:55:35

依云
会员
所在地: a.k.a. 百合仙子
注册时间: 2011-08-21
帖子: 8,919
个人网站

Re: shell 脚本中的信号处理

自由建客 说:

至于信号会发给哪些进程,比较复杂,参见《UNIX 环境高级编程》中「进程关系」一章。

已经搞清楚了,需要 setpgrp 下,貌似 shell 搞不定了。

shell 自己捕获信号我是知道的。

离线

#4 2013-05-20 08:23:45

Mosalut
会员
注册时间: 2012-04-06
帖子: 53

Re: shell 脚本中的信号处理

setogrp是干嘛的 是修改系统调用中关于ctrl-c产生的中断吗?
那么是不是这个一个所有的ctrl-c都改了不光针对这一个程序?

离线

#5 2013-05-20 10:59:00

依云
会员
所在地: a.k.a. 百合仙子
注册时间: 2011-08-21
帖子: 8,919
个人网站

Re: shell 脚本中的信号处理

Mosalut 说:

setogrp是干嘛的 是修改系统调用中关于ctrl-c产生的中断吗?
那么是不是这个一个所有的ctrl-c都改了不光针对这一个程序?

是 setpgrp,你查文档就知道了,设置进程组用的。Ctrl-C 是发送 SIGINT 到前台进程组。把子进程放到新的组里应该就可以了。

离线

#6 2013-05-20 11:36:19

Mosalut
会员
注册时间: 2012-04-06
帖子: 53

Re: shell 脚本中的信号处理

离线

页脚