シェルでctrl+c
を押すと、プログラムを中断できます。多くの場合、これはプログラムを強制終了しますが、一部のプログラムは信号をトラップして実行を続けます。
私はそのようなプログラムをもっと積極的に殺すことができるようになりたいと思って、いくつかの研究をしました。 stty -a
にttyショートカットがリストされることを読みました。出力は次のとおりです。
speed 38400 baud; rows 27; columns 213; 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; discard = ^O; min = 1; time = 0;
-parenb -parodd -cmspar 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 -flusho -extproc
私にあなたの注意を向けさせてください
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; [...]
^C
と^D
の2つは見覚えがあり、^U
はsigkillを送信する必要があるようです。これはkill -9
のようになります。
私の特定のケースでは、dddを殺したいのですが、そうしないと閉じるのが難しい場合があります。シェルからcrtl+u
した場合、そのPIDのkill -9
はそれを殺しますが、効果はありません。
stty -a
からのこの出力の解釈が間違っていますか? ctrl+u
はSIGKILLを送信する必要がありますか?なぜこれが期待どおりに機能しなかったのですか?または、シェル(つまり、dddが起動されたシェル)からSIGKILLを便利に送信するにはどうすればよいですか?
その殺害はキャラクターの暗殺のためであり、合図による死ではありません。 termios(4)
のマニュアルページに記載する必要があります。
消去と強制終了の処理は、2つの特殊文字であるERASE文字とKILL文字(特殊文字のセクションを参照)のいずれかが受信されたときに発生します。この処理は、改行NL、EOF、またはEOL文字でまだ区切られていない入力キュー内のデータに影響します。この区切られていないデータが現在の行を構成します。 ERASE文字は、現在の行の最後の文字がある場合はそれを削除します。 KILL文字は、現在の行にあるすべてのデータを削除します。
またはLinuxではtermios(3)
VKILL(025、NAK、Ctrl-U、またはCtrl-X、または@)キャラクターを殺す(KILL)。これにより、最後のEOFまたは行頭以降の入力が消去されます。ICANONが設定されている場合に認識され、入力として渡されません。