(Cプログラムまたはスクリプト)出力が入力バッファに到達するようにパイプとリダイレクトを使用してみましたが、printf "\033[6n"
肯定的な結果はありませんでした。
これがどのように可能かを知っている人はいますか?
- コマンドライン
- シェルスクリプトから
- Cコード
パイプ出力_cmd_ > /dev/stdin
とCコードにはfprintf(stdin, "blah\n");
測定可能な影響はありません。
メモ:私は入力を別のコマンドで「パイプ」したくなく、「キーボードバッファ」(実際)に文字を「注入」したいと思います。
編集する:最初のユースケースは、次のshell
ことを可能にするSandbox CLIアプリケーションです。system
注文するオペレーティングシステム(例:Bas)と対話しますが、いいえファイル記述子を処理します。
ベストアンサー1
編集する:短い答え以前は /dev/uinput
、そして今はそうですTIOCSTI
(投稿の終わりを参照)
これまでの回答とコメントへの回答は次のとおりです。
ioctl_tty(2)
TIOCSTI
私はそれを持っていませんが、カーネルのソースコードを見ると(経由)自由電子tiocsti
)は、コンテキストを使用する「偽の入力文字」を表示しますtty_struct
。
問題のアプリケーションは常に対話型で実行されるため、パイプとリダイレクトは使用できません。スクリプトに使用できますが、shell
他の同様のアプリケーションとは異なり、結果のキャプチャは許可されず、通常の方法で操作を許可およびstdin
実行します。stdout
近い将来、これが変わる可能性はなく、それは私のアプリケーションではありません。ただし、コンテキストを使用して&inを使用すると、カーネルによってキーボードバッファに注入された"\033[6n"
結果を切り取ることができます。tty_insert_flip_char
tty_schedule_flip
src/drivers/tty/tty_buffer.c
tty_port
私の記憶が正しい場合、FDファイル構造が変更される前に、ただ4つのファイル記述子がこれを達成できます。最近はTTYデバイスに書き込むことができますが、TTYデバイス/dev/stdin
に接続されており、TTYデバイスに書き込んだすべての内容は最終的に画面に表示されます()。カーネルは、TTYを使用するときにファイル記述子ルーティングをバイパスするようです。これらの関数はそれを呼び出します。/proc/self/fd/0
/dev/tty#
/dev/stdout
flip
ポート。
ユーザー空間アプリケーションはこれらのカーネル機能にアクセスできません。 X-Windowsではxvkbd
およびxdotool
またはを使用できますが、xte
このアプリケーションはLinux(VT)コンソールで使用されます。
(ほぼ)正しい答えは次のとおりです。
/dev/uinput
ユーザー権限がなくても(ほとんどのシステムでは)すべてのパラメータが機能するsudo
スクリプトですprintf
。
またはキーボードイベントまた、すべてのユーザーがアクセスできるため動作しますが、起動するたびにすべてのシステムを変更します(私は一般的ですが、必ずしも/dev/input/event0
そうではありません)。
さらなる調査によると、これらの方法のうち特にスクリプトには実用的ではない。私たちは何をすべきかを理解しなければなりません。私たちはレンダリングしたいだけです。テキスト「キー押しシミュレーション」(上記のデバイスの動作)ではなく、入力バッファにあります。
(最も実用的な)実際の答えは次のとおりです。
オフサイトの質問は、2011年のstackexchangeに対する回答を引用します(ここ)。 。TIOCSTI
もう一度Perlの例を見ると、アプリケーションを提供しないスクリプトにも役立ちます。
perl -le 'require "sys/ioctl.ph";
ioctl(STDIN, &TIOCSTI, $_) for split "", join " ", @ARGV
' `_cmds_`
しかし、画面にも反映されます。数時間の追加調査と実験を経た後、スクリプトやコマンドラインで以下が実用的になりました。
stty -echo; perl -le 'require "sys/ioctl.ph"; ioctl(STDIN, &TIOCSTI, $_) for split "", join " ", @ARGV ' `_cmds_` ;stty echo
メモ:TIOCSTI
退会したけどオープンBSD 6.2(2017年10月)明らかにLinuxカーネル開発者は反対キャンセルをしっかり拒否します(次からキャンセルできます)。OpenBSDジャーナル)。