shの標準入力に送信されたTTY制御文字は効果がありません。

shの標準入力に送信されたTTY制御文字は効果がありません。

実行できるリモートアプリケーションを開発しようとしています。シェンそこから着信データを送り返すと、いくつかの特別なシーケンスが機能しないことがわかりました。

そのため、テスト目的でデスクトップからsh起動し、コマンドを実行し、次にping localhost別のシェルで実行してpingを中止しようとしました。バイトはecho -e "\003" > /proc/$shPID/fd/0+組み合わせ0x3で生成されたバイトです。私が何をしようとしてもCtrlC(改行追加、先頭にCSI追加)、動作しません。文字が標準出力に表示されます。シェン (例えば改行文字を意味します)しかし、ping操作を中断することはありません。

shのstdinを介してpingを停止する方法は?

答え1

^C処理は、シェルではなくターミナルデバイスドライバによって実行されます。

この文字がttyデバイスに接続されている行で受信されると(または疑似ターミナルペアのマスター側に書き込まれる(を押すとxtermCtrl+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同じ擬似端末を参照しないからです。説得力が必要それ xtermfd 4に^ Cを書き込みます。

だからそれは実際にはオプションではありません。

独自の擬似端末ペアを起動し、その中でshとpingを実行できます。その後、マスター側に^ Cを作成して対応するSIGINTを前景プロセスグループに送信できますが、ここでは信号を直接送信する方が簡単です(SIGTERMが好ましい)。

また、に文字を書き込もうとするのは/proc/$pid/fd/0実際には意味がありません。ファイル記述子は通常、読み取るために開いています。 Linuxでopen()を実行すると、実際に/proc/$pid/fd/0fdが指すリソースが再び開きます。

たとえば、shwasがで始まる場合、sh < /some/fileアクションを実行すると、echo something > "/proc/$shpid/fd/0"の内容はwithに置き換えられます。 ttyの場合、その端末にのみ表示されます。書き込みが何かを読む唯一のケースは、sh stdingがパイプのときです。 Linux(およびLinuxのみ)で書き込みモード(パイプがある場合)を実行すると、パイプの書き込み側が開きます(そしてfd 0は実際に読み込み側を指します)。/some/filesomething\nsomethingsomethingshopen()/proc/$shpid/fd/0

関連情報