我经常开始读取一个大文件,然后想在一段时间后退出,但是从按
Ctrl+ C到程序停止有一个滞后。是否可以通过几次按Ctrl+ C键来缩短延迟?还是我在浪费按键?
^C
在注册印刷机时会打印出来(至少bash
我经常开始读取一个大文件,然后想在一段时间后退出,但是从按
Ctrl+ C到程序停止有一个滞后。是否可以通过几次按Ctrl+ C键来缩短延迟?还是我在浪费按键?
^C
在注册印刷机时会打印出来(至少bash
Answers:
在第一个之后Ctrl-C,程序将接收SIGINT
并通常开始清理(删除tmp文件,关闭套接字等)。如果Ctrl-C在此过程中再次击打,则可能会打断清理例程(即,可能会作用于其他信号而不是一个人),从而留下一团糟。虽然这通常不是这样的,比较常用的附加信号在事实上发送后该过程完成(由于操作员与系统交互的固有延迟)。这意味着信号被另一个进程(通常是shell,但并非总是)接收。如果该接收者不能正确处理此信号(像shell通常那样-参见Jenny D的回答),您可能会对这种操作的结果感到不满意。
INT
该过程收到的另一个信号。
trap "sleep 20 || echo clean up cancelled!" EXIT ; sleep 10
。运行脚本,然后按ctrl-C两次。您将看到第二个ctrl-C被传递到“清除”例程(在trap语句中)并终止其sleep
命令。
trap "sleep 20 || echo clean up cancelled!; sleep 10; echo 'but continued'" EXIT ; sleep 10
只是sleep
获得信号的命令。我们俩都错了xD
isig
为on,则内核按下并接收CTRL-C时(对于终端仿真器,只要终端仿真器将其写入到伪终端的主端),就会将SIGINT信号发送到所有终端的前台进程组中的进程。它可能在此处被阻止,但是以后将不会传递给另一个进程。即使终端设备缓冲区已满(应用程序尚未读取您键入的任何内容),CTRL-C也会跳过队列。
你是在浪费他们。发生的所有事情是,一旦服务器完成屏幕输出,它将收到多个消息Ctrl-C。第一个将用于终止该进程,而下一个将终止于您的shell中,然后看起来像
[user@server]$ ^C
[user@server]$ ^C
[user@server]$ ^C
[user@server]$ ^C
[user@server]$ ^C
[user@server]$
简短的答案:如果该过程对此有反应。
长答案:当您点击ctrl+时c,内核会向进程发送信号。可以通过以下命令确定哪个信号:
user@host:~# stty -a | grep -i "\^C"
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>;
参见手册页stty
:
intr CHAR
CHAR will send an interrupt signal
它是信号INT
,也称为数字2。当进程具有信号处理程序时,它可以对此做出反应。大多数进程都会执行一些清理作业以成功结束。
kernel
(终端的线路规程,终端驱动程序)将SIGINT发送到终端的前台进程组中的每个进程。
bash
,但zsh
始终关闭父级的情况却并非如此。这是我喜欢的原因之一zsh
。