考虑一下我在Mac OS和Linux中使用命令行的经验: 当我想停止或终止某些程序时, 我经常要尝试" CTL-C" &安培; " CTL-D",以便查看哪一个确实有效。
我怎样才能确定使用哪一个,而不是每次都尝试?
" CTL-C"的区别意义是什么? &安培; " CTL-d"在UNIX环境中?
答案 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>