^D/EOT文字をシェルプロセスの標準入力にどのように送信しますか?

^D/EOT文字をシェルプロセスの標準入力にどのように送信しますか?

1つはPID 1234で、もう1つはPID 5678の2つのシェルを開くと仮定します。

私はできます。画面を消去端末自体のプロンプトに入力するecho $'\033c' > /proc/1234/fd/0のと同じように、他のシェルをリセットします。resetしかし、echo $'\04' > /proc/1234/fd/0EOT文字を送信すると動作しないようです。希望の効果をどのように取得できますか?

ベストアンサー1

まず、ttyはファイルオブジェクトのように見えますが、実際にはペアのパイプ/キューです。 1 つは出力用で、もう 1 つは入力用で、各パイプ/キューのもう一方の端は一部のハードウェアデバイスに接続されています。擬似端末の場合、他のプログラムで使用されます。 ttyに接続されたfdに何でも書くとき、あなたは書いているものです。出力キュー(プロセスのfd 0(stdin)の場合でもループバックしません)入力する待ち行列。

ほとんどのUnixシステムでは(注目すべき価値があります。オープンBSDTIOCSTI)、まるで相手から受け取ったようにttyの入力キューにバイトを挿入できるようにする特別なioctl()があります。TIOCSTIこれを呼び出すプロセスの制御ttyに使用されていない場合は、rootとしてのみ機能します。

$ cc -Wall tiocsti.c -o tiocsti

- rootユーザーとして -

# printf '\04' | ./tiocsti >/proc/5460/fd/0

プロセスがpseudo-ttyで実行されている場合、入力を「偽」にするもう1つの方法は、デバッガを使用してpseudo-ttyのマスター側を保持するプロセスに接続し、そこからそのプロセスwrite(2)に内容を入れることです。

$ gdb -p pid_of_xterm
(gdb) p write(4, "\x04", 1)   # 4 is the fd of the master pty
(gdb) c

どちらの方法でも通過。実行中のプロセスを制御するには、一部の入力を偽造するのではなく、プロセスにデバッガを接続する方がよいでしょう。対話型プログラムをツールとして使用するには、それを実行することをお勧めします。expect;両方ともすべてのUnixシステムで実行され、追加の権限は必要ありません。

また^D、/は次の場合\004にのみ機能します。EOFㅏ)ttyが標準モードになっています。第二c_cc[VEOF]特殊文字は他の文字に変更されません。)出力キューは空です(そうでない場合はc_cc[VEOF]2回送信する必要があります)。もちろん、ttyから読み込むプロセスはEOFまたはそのバイトを取得しますが、必ずしもシェルを取得するわけではありません。

tiocsti.c

#include <sys/ioctl.h>
#include <unistd.h>
#include <err.h>

int main(void){
        char c; ssize_t r;
        while((r = read(0, &c, 1)) > 0){
                if(ioctl(1, TIOCSTI, &c)) err(1, "ioctl(TIOCSTI)");
        }
        if(r < 0) err(1, "read");
        return 0;
}

おすすめ記事