=Start=
缘由:
「What does CTRL-c do?」
正文:
- Ctrl-c 是向终端发送 SIGINT 信号「intr = ^C」,终止一个进程/任务
- Ctrl-z 是向终端发送 SIGSTOP 信号「
susp = ^Z
」,挂起一个进程/任务(任务并没有结束,它仍然在进程列表中,只是维持挂起的状态(T),用户可以使用fg/bg命令继续前台或后台的任务,fg命令重新启动前台被挂起的任务,bg命令把被挂起的任务放在后台执行) - Ctrl-d 不是发送信号,而是表示一个特殊的二进制值「eof = ^D」,表示 EOF ;在Windows下是通过组合键
Ctrl-z
来表示 EOF
Linux、Mac下可以通过 `stty -a` 命令看终端配置(也可以通过`stty`命令进行修改):
#CentOS $ stty -a speed 38400 baud; rows 59; columns 270; line = 0; intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0; -parenb -parodd cs8 -hupcl -cstopb cread -clocal -crtscts -cdtrdsr -ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany -imaxbel -iutf8 opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0 isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke #Mac OSX $ stty -a speed 38400 baud; 59 rows; 270 columns; lflags: icanon isig iexten echo echoe echok echoke -echonl echoctl -echoprt -altwerase -noflsh -tostop -flusho pendin -nokerninfo -extproc iflags: -istrip icrnl -inlcr -igncr ixon -ixoff ixany imaxbel iutf8 -ignbrk brkint -inpck -ignpar -parmrk oflags: opost onlcr -oxtabs -onocr -onlret cflags: cread cs8 -parenb -parodd hupcl -clocal -cstopb -crtscts -dsrflow -dtrflow -mdmbuf cchars: discard = ^O; dsusp = ^Y; eof = ^D; eol = <undef>; eol2 = <undef>; erase = ^?; intr = ^C; kill = ^U; lnext = ^V; min = 1; quit = ^\; reprint = ^R; start = ^Q; status = ^T; stop = ^S; susp = ^Z; time = 0; werase = ^W;
如果不希望 Ctrl-c
按键起作用,或者想要插入自己的处理程序,可以使用stty
禁用该功能,或者使用trap
捕获该信号,插入自己的处理程序。
#使用stty禁用该(Ctrl-c)功能
在bash脚本中插入如下命令即可:
stty intr undef
请注意,该命令同时把整个终端的设置都改掉,导致 Ctrl-c 对于其它程序也不能用,所以在你的程序末尾还要将 Ctrl-c 恢复,使用如下命令:
stty intr ^c
#使用trap捕获该(Ctrl-c)信号
首先定义一个处理函数,比如 cleans ,用于捕获信号后的处理。
cleans() { echo "user cancelled, exit..." exit 1 #如果不希望退出,可以删掉此行 }
然后使用trap捕获信号
trap "{ cleans; }" 1 2 3 6 9 15
花括号中是处理函数的名称,后面的数字是信号量的代号。使用 kill -l 命令可以查看各种信号量的代码,其中中断信号(SIGINT)就是2。
参考链接:
- http://www.cnblogs.com/xlmeng1988/archive/2012/06/04/ctrl.html #全面
- http://chyd96.blog.163.com/blog/static/62706076201012642227509/
- http://www.2cto.com/os/201107/97102.html
- http://blog.csdn.net/Andrew659/article/details/5726010
- http://idas643.blog.163.com/blog/static/167104838201341493846584/
- http://www.cnblogs.com/softwaretesting/archive/2011/09/20/2182339.html
- http://blog.chinaunix.net/uid-23960482-id-111808.html
- http://man7.org/linux/man-pages/man7/signal.7.html #各种信号量代码说明
- http://blog.csdn.net/ithomer/article/details/5669762
=END=
《 “Linux中'Ctrl + c'按键的作用” 》 有 2 条评论
在shell脚本开头处添加如下代码可以有效捕获一些异常并执行预定的清理操作
`
TEMP_DIR=”$(mktemp -d -t XXXX)”
trap ‘RESULT=$?; rm -rf “$TEMP_DIR” ; exit $RESULT’ INT TERM EXIT QUIT
`
https://gist.githubusercontent.com/steakknife/7969875/raw/make_man_tarball.sh
Linux 进程学习(四)—— sigaction 函数 #简单明了
http://www.cnblogs.com/wblyuyang/archive/2012/11/13/2768923.html
Linux下的信号详解及捕捉信号 #全面
http://www.jb51.net/article/90695.htm
如何忽略(除了 SIGKILL 和 SIGSTOP 之外的)所有信号
https://stackoverflow.com/questions/10046916/is-it-possible-to-ignore-all-signals
linux系统编程之信号(五):信号集操作函数,信号阻塞与未决
http://www.cnblogs.com/mickole/p/3191281.html
关于Linux信号的一切(All about Linux signals) #全面细致
http://www.linuxprogrammingblog.com/all-about-linux-signals?page=show
Linux 信号处理
https://fixatom.com/deal-with-linux-signals/
http://man7.org/linux/man-pages/man2/sigaction.2.html
http://man7.org/linux/man-pages/man3/sigfillset.3.html
http://man7.org/linux/man-pages/man2/sigprocmask.2.html
https://stackoverflow.com/questions/27227585/what-is-sigaddset-used-for