あるコンソールの標準入力から別のコンソールに読み込むプロセスのテキスト入力をどのように終了しますか? - 通常、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/0
42を印刷する必要があります。
ただし、目的の作業をパイプやソケットなどでさまざまな方法で設計する方が良いでしょう。
答え2
プロセスの標準入力は端末にのみ接続されています。これを見るには、リストを作成してください。
> ll /proc/self/fd
total 0
lrwx------ 1 root root 64 Sep 12 11:32 0 -> /dev/pts/1
lrwx------ 1 root root 64 Sep 12 11:32 1 -> /dev/pts/1
lrwx------ 1 root root 64 Sep 12 11:32 2 -> /dev/pts/1
したがって、エコー「テキスト」は、見てわかるように、実際にその端末に出力される。達成したいことがプロセスに入力を送ることであれば、FIFOはあなたの要件に合うでしょうか?たとえば、
on tty1:
$ mkfifo input
$ cat > input <<-eof # send process some input (being careful not to close your output before completely done)
echo Hi
echo World
read ans
42
echo \$ans
eof
2番目のプロセスは「入力」FIFOから読み取られます。
e.g. on tty1, in the same directory with the "input" fifo:
$ bash -x < input
+ echo Hi
Hi
+ echo World
World
+ read ans
+ echo 42
42