BashでリダイレクトEnterキーを押します。

BashでリダイレクトEnterキーを押します。

あるコンソールの標準入力から別のコンソールに読み込むプロセスのテキスト入力をどのように終了しますか? - 通常、Enterキーを押すと実行される操作です。

コンソール1:ユーザーがEnterキーを押さない限り(通常の動作)、C ++プログラムはstd :: cinからデータを読み取ります。

コンソール2:通常のコンソールでは、次の方法でコンソール1のプロセスにテキストを送信できることがわかりました。

echo "some text" >> /proc/18672/fd/0

(PID 18672のマイプロセスの標準入力に書き込みます。)

この方法は機能しますが、重要なステップがありません。

コンソール2で「一部のテキスト」を入力するにはどうすればよいですか?または、コンソール2でコンソール1のEnterキーを押すことをシミュレートするにはどうすればよいですか?

改行文字 (たとえば "\n") を使用しても効果はありません。

ベストアンサー1

他の方法で設計する方が良いだろうという疑問はありません(OpenBSDはTIOCSTI ioctlのサポートを削除しました)。これを念頭に置いて、まず.NETstd::cinで動作させる適切なC ++コードが必要です/dev/pts/0

$ cat foo.cpp
#include <iostream>
int main() {
        int n;
        std::cin >> n;
        std::cout << n;
}
$ c++ foo.cpp
$ tty
/dev/pts/0
$ ./a.out

その後、別の端末でコンパイルします。

// ttytickle.c - send characters via TIOCSTI
#include <sys/types.h>
#include <sys/ioctl.h>
#include <sys/stat.h>
#include <err.h>
#include <fcntl.h>
int main(int argc, char *argv[]) {
        int fd = open(*++argv, O_WRONLY);
        if (fd < 0) err(1, "open failed '%s'", *argv);
        char word[] = "42\n";
        char *wp = word;
        while(*wp != '\0') ioctl(fd, TIOCSTI, wp++);
        return 0;
}

上記のコマンドを実行します。

$ make ttytickle && ./ttytickle /dev/pts/0
cc     ttytickle.c   -o ttytickle

そして(TIOCSTIがサポートされていると仮定すると、文字列は長すぎません。など)、端末./a.outで実行すると/dev/pts/042を印刷する必要があります。

ただし、目的の作業をパイプやソケットなどでさまざまな方法で設計する方が良いでしょう。

おすすめ記事