如何区分CTL-D和CTL-C键盘中断一般?

时间:2015-11-18 06:19:56

标签: linux unix command-line

考虑一下我在Mac OS和Linux中使用命令行的经验: 当我想停止或终止某些程序时, 我经常要尝试" CTL-C" &安培; " CTL-D",以便查看哪一个确实有效。

我怎样才能确定使用哪一个,而不是每次都尝试?

" CTL-C"的区别意义是什么? &安培; " CTL-d"在UNIX环境中?

3 个答案:

答案 0 :(得分:0)

Ctl-C表示“中止执行”。 Ctl-D表示“文件结束/输入结束”。你在一个等待输入的程序上使用一个,而另一个拒绝等待输入的程序。

答案 1 :(得分:0)

流程如何对任一流程做出反应取决于流程。如果它没有从输入中读取任何内容,则可以忽略CTRL-D,甚至可能甚至没有注意到。另一方面,大多数进程将在SIGINT上退出(默认行为),但最终由代码决定如何处理它。 SIGINT是一个信号,因此必须以某种方式处理它(它会立即触发过程中的信号处理代码)。 CTRL-D没有明确地触发过程中的反应,它只是在进程读取输入时(以及如果)导致End-Of-File。显然,CTRL-D将无效,因为进程输入被重定向。

如果您想要可靠地杀死它,请使用kill

答案 2 :(得分:0)

开始的地方是终端设置。当 control C control D 几乎总是分配给同一个函数时,可以更改终端驱动程序。

要看到这个:

$ stty -a |for-paste
speed 38400 baud; rows 40; columns 80; line = 0;
intr = ^C; quit = ^\; erase = ^H; 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
-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

显示

intr = ^C
eof = ^D

即,^C control C )已分配给intr^D control D )被分配给eof。原则上,stty显示的任何设置都可以修改。在Unix系统上找到intr设置为不同的值并不罕见。

这些作为一个开头是有帮助的:

但POSIX提供了准确的信息:

  

<强> EOF
  输入上的特殊字符,如果设置了 ICANON 标志,则会识别该字符。收到后,等待读取的所有字节将立即传递给进程,而不等待 <newline> ,并且EOF将被丢弃。因此,如果没有字节等待(即,EOF发生在一行的开头),则应从read()返回字节计数为零,表示文件结束指示。如果设置了 ICANON ,处理时将丢弃 EOF 字符。

     

<强> INTR
  输入上的特殊字符,如果设置了 ISIG 标志,则会识别该字符。生成 SIGINT 信号,该信号被发送到终端为控制终端的前台进程组中的所有进程。如果设置了 ISIG ,处理后将丢弃 INTR 字符。

也就是说,EOF告诉程序没有更多要读取的数据。 INTR 信号该程序;该程序实际上决定如何处理这些信息。更重要的是,你应该发送QUIT,通常(再次,程序依赖)告诉程序停止它正在做的事情。

这些信号(SIGINT,SIGQUIT)可以被程序捕获。 POSIX在<signal.h>

中记录了它们的常规用法