多次按 ctrl-c 会使正在运行的程序关闭得更快吗?

The*_*Cat 41 process kill signals

我经常开始读​​取一个大文件,然后在一段时间后想退出,但是从按
Ctrl+C到程序停止有延迟。是否有可能通过多次按Ctrl+C键来缩短延迟?还是我在浪费我的按键?

Joh*_*024 35

在第一个之后Ctrl-C,程序将接收SIGINT并通常开始清理(删除 tmp 文件、关闭套接字等)。如果您在此过程中Ctrl-C再次点击,您可能会中断清理程序(即可能会处理附加信号而不是单独处理),从而留下一团糟。虽然这通常不是这样的,比较常用的附加信号在事实上发送过程完成(因为操作员与系统交互的固有延迟)。这意味着信号被另一个进程接收(通常是 shell,但不总是)。如果该接收者没有正确处理这个信号(就像 shell 通常做的那样 - 请参阅 Jenny D 的回答),您可能会对这种操作的结果感到不快。

  • @chaos 为什么要这样做?如果清理程序已挂断并且您想停止它,则应该这样做。它真的以这种方式工作吗?是的,经常。您可以简单地演示一下:使用单行 `trap "sleep 20 || echo clean up cancelled!" 制作一个 bash 脚本。出口 ; 睡10`。运行脚本并按 ctrl-C 两次。您将看到第二个 ctrl-C 被传递到“清理”例程(在陷阱语句中)并终止其 `sleep` 命令。 (4认同)
  • 那是不正确的。信号传递是同步的。如果 `isig` 开启,一旦按下 CTRL-C 并被内核接收到(对于终端模拟器,只要终端模拟器将其写入伪终端的主端),就会发送 SIGINT 信号到终端前台进程组中的所有进程。它可能在那里被阻塞,但它不会稍后被传递到另一个进程。即使终端设备缓冲区已满(应用程序尚未读取您键入的任何内容),CTRL-C 也会跳入队列。 (2认同)

Jen*_*y D 11

你在浪费它们。所发生的一切是,一旦服务器完成屏幕输出,它将收到多个Ctrl-C. 第一个将用于终止进程,接下来的将在您的 shell 中结束,然后看起来像

[user@server]$ ^C
[user@server]$ ^C
[user@server]$ ^C
[user@server]$ ^C
[user@server]$ ^C
[user@server]$ 
Run Code Online (Sandbox Code Playgroud)

  • 该进程在发送 SIGINT 时不一定会退出。它可以无限期地保持活动状态,并在每次按下 Ctrl+C 时执行不同的操作。 (6认同)

cha*_*aos 5

简短回答:如果过程对其做出反应。

答案:当您点击ctrl+ 时c,内核会向进程发送信号。可以通过以下命令确定哪个信号:

user@host:~# stty -a | grep -i "\^C"
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>;
Run Code Online (Sandbox Code Playgroud)

请参阅以下手册页stty

   intr CHAR
          CHAR will send an interrupt signal
Run Code Online (Sandbox Code Playgroud)

它是信号INT,也称为数字 2。当进程有一个信号处理程序时,它可以对此做出反应。大多数进程会执行一些清理工作以成功结束。

  • 不,不是 shell 将 SIGINT 发送到进程。是“内核”(终端的线路规则,终端驱动程序)将 SIGINT 发送到终端的前台进程 _group_ 中的每个进程。 (4认同)