実行できるリモートアプリケーションを開発しようとしています。シェンそこから着信データを送り返すと、いくつかの特別なシーケンスが機能しないことがわかりました。
そのため、テスト目的でデスクトップからsh
起動し、コマンドを実行し、次にping localhost
別のシェルで実行してpingを中止しようとしました。バイトはecho -e "\003" > /proc/$shPID/fd/0
+組み合わせ0x3
で生成されたバイトです。私が何をしようとしてもCtrlC(改行追加、先頭にCSI追加)、動作しません。文字が標準出力に表示されます。シェン (例えば改行文字を意味します)しかし、ping操作を中断することはありません。
shのstdinを介してpingを停止する方法は?
答え1
^C処理は、シェルではなくターミナルデバイスドライバによって実行されます。
この文字がttyデバイスに接続されている行で受信されると(または疑似ターミナルペアのマスター側に書き込まれる(を押すとxterm
)Ctrl+C)、ttyラインルール(カーネル)がターミナルのフォアグラウンドプロセスグループに書き込みます。 SIGINT 信号を送信します。
したがって、その文字をxtermがコンソールで開くfdに送信する必要があります。
$ eval "$(xprop -notype -id $WINDOWID 32i '=$0\n' _NET_WM_PID)"; lsof -ap "$_NET_WM_PID" /dev/ptmx
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
xterm 21123 stephane 4u CHR 5,2 0t0 1460 /dev/ptmx
Linuxで書くとうまく/proc/21123/fd/4
いきません。再び開くので、/dev/ptmx
同じ擬似端末を参照しないからです。説得力が必要それ xterm
fd 4に^ Cを書き込みます。
だからそれは実際にはオプションではありません。
独自の擬似端末ペアを起動し、その中でshとpingを実行できます。その後、マスター側に^ Cを作成して対応するSIGINTを前景プロセスグループに送信できますが、ここでは信号を直接送信する方が簡単です(SIGTERMが好ましい)。
また、に文字を書き込もうとするのは/proc/$pid/fd/0
実際には意味がありません。ファイル記述子は通常、読み取るために開いています。 Linuxでopen()を実行すると、実際に/proc/$pid/fd/0
fdが指すリソースが再び開きます。
たとえば、sh
wasがで始まる場合、sh < /some/file
アクションを実行すると、echo something > "/proc/$shpid/fd/0"
の内容はwithに置き換えられます。 ttyの場合、その端末にのみ表示されます。書き込みが何かを読む唯一のケースは、sh stdingがパイプのときです。 Linux(およびLinuxのみ)で書き込みモード(パイプがある場合)を実行すると、パイプの書き込み側が開きます(そしてfd 0は実際に読み込み側を指します)。/some/file
something\n
something
something
sh
open()
/proc/$shpid/fd/0