問題タブ [unbuffered-output]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - セグメンテーション違反の質問
C プログラムではprintf
、セグメンテーション違反の前のどこかに in コードがあると、出力されないことがあります。これはなぜですか?
oracle - Oracle PL/SQL - 即時出力/コンソール印刷のヒント
実行に数分かかる可能性のある多数の pl/sql プロシージャがあります。それらを開発している間、私はいくつかの印刷ステートメントを追加して、デバッグを支援し、フィードバックと進行状況のインジケーターも提供しました。最初に、これらを小さなテスト セットで実行したところ、出力はほぼ瞬時に得られました。実行に数分かかる大規模なテスト セットをテストしているので、手順が終了するまで何も出力されないため、コンソールへの出力はもはや適切ではないことがわかりました。私は、出力をバッファリングしてすぐに印刷しない環境で作業することに慣れており、簡単なデバッグと診断のために簡単な print-statement を追加するのが一般的です。
pl/sql で出力をすぐに (バッファリングせずに) 印刷することは可能ですか? そうでない場合、人々は同様の結果を得るためにどのような代替手段を推奨していますか?
bash - bash: exec されたプロセスにバッファリングされていない stdout を強制するようにしました
次のようなスクリプトがあります。
問題は、some_binary
すべてのログを標準出力に送信することです。バッファリングにより、出力が数行のチャンクでしか表示されなくなります。何かが動かなくなって、最後の行が何を言っているかを確認する必要がある場合、これは面倒です。
some_binary に影響を与える exec を実行する前に stdout をバッファリングしないようにする方法はありますか?
(ラッパー スクリプトは、exec の前にいくつかの環境変数を設定するだけなので、perl または python での解決策も実現可能です。)
android - Android: ファイルを内部データに保存するときに BufferedOutputStream が必要ですか?
文字列をファイルに保存して読み返したかったので、次の 2 つの例に従いました。
ただし、両方とも BufferedOutputStream ラッパーは使用されていませんが、FileOutputStream のドキュメントではそれが推奨されています。
これは簡単な例にするために行われたのでしょうか、それとも Android では本当に必要ないのでしょうか? そして、答えは何でもInputStreamにも適用されますか?
よろしく、クラゲ
bash - バッファなしで tty を保存するには?
バッファに問題があります:
デーモン D とそのモニター M があります。D は M の前に開始され、M は関連情報を tty に出力します。この情報を解析して、自分のプログラムに渡す必要があります。
これを自動化したいので、M はファイルに出力する必要があります。しかし、バッファのために、デーモンが殺されるまではそうではありません。
だから私はttyを記録することを考えていたので、スクリプトを使用して出力を端末に記録しようとしましたが...それもバッファリングされています...
また、gnu coreutils にアクセスしようとしましたが (明らかに必要な stdbuf を利用するため)、GNU の Web サイトで提案されている独特の .xz 形式を解凍するためのユーティリティをインストールできなかったため、あきらめなければなりませんでした。
私は正しいことをしていないのではないかと心配しています!リアルタイムで作業するすべての人が持っている可能性のある、この問題に対する簡単な解決策はありませんか??
少し助けていただければ幸いです。ありがとう。
windows - Windows の unbuffer プログラムに相当するものは何ですか?
こんにちは、この投稿によると、疑似端末 (pty) を介してコマンドにunbuffer
接続します。これにより、システムは対話型プロセスとして扱われるため、stdout バッファリングは使用されません。
この機能を Windows で使用したいと考えています。unbuffer
Windows の program に相当するものを教えてください。ありがとう。
python - 子プロセスが入力を待っているときの検出
ユーザーがアップロードした任意の (したがって、最悪の場合、安全でなく、エラーが発生し、クラッシュする) コードを Linux サーバーで実行するための Python プログラムを作成しています。セキュリティの問題はさておき、私の目的は、コード(コンパイルまたは解釈された任意の言語である可能性があります)が正しいものを に書き込むかどうかstdout
、stderr
およびプログラムのstdin
. この後、結果をユーザーに表示する必要があります。
現在の解決策
現在、私の解決策は、 、およびsubprocess.Popen(...)
のファイルハンドルを使用して子プロセスを生成することです。ハンドルの後ろのファイルには、プログラムが操作中に読み取る入力が含まれており、プログラムが終了した後、ファイルとファイルが読み取られて正確性がチェックされます。stdout
stderr
stdin
stdin
stdout
stderr
問題
このアプローチはそれ以外の場合は完全に機能しますが、結果を表示するときに、指定された入力と出力を組み合わせて、端末からプログラムを実行したときと同じ場所に入力が表示されるようにすることはできません。つまり、次のようなプログラムの場合
stdout
実行後のプログラムの内容を含むファイルの内容は次のようになります。
を含むファイルの内容stdin
がAnonymous<LF>
. したがって、要するに、指定されたサンプルコード (および同等に、他のコード) に対して、次のような結果を達成したいと考えています。
したがって、問題は、プログラムがいつ入力を待っているかを検出することです。
試した方法
問題を解決するために、次の方法を試しました。
Popen.communicate(...)
これにより、親プロセスはパイプに沿って個別にデータを送信できますが、一度しか呼び出すことができないため、ドキュメントから推測できるように、複数の出力と入力を持つプログラムには適していません。
Popen.stdoutとPopen.stderrから直接読み取り、Popen.stdinに書き込む
ドキュメントはこれに対して警告しており、プログラムが入力を待機し始めると、Popen.stdout
s.read()
と.readline()
呼び出しが無限にブロックされるようです。
select.select(...)
ファイルハンドルが I/O の準備ができているかどうかを確認するために使用します
これでは何も改善されないようです。どうやら、パイプは常に読み取りまたは書き込みの準備ができているようです。そのため、select.select(...)
ここではあまり役に立ちません。
ノンブロッキング読み取りに別のスレッドを使用する
この回答で示唆されているように、からの読み取り結果を Queue() に格納する別のThread()を作成しようとしました。ユーザー入力を要求する行の前の出力行は適切に表示されますが、プログラムがユーザー入力の待機を開始する行 (上記の例) は読み取られません。stdout
"Type your name: "
子プロセスのファイル ハンドルとしてPTYスレーブを使用する
hereの指示に従ってpty.openpty()
、マスターとスレーブのファイル記述子を使用して疑似端末を作成しようとしました。その後、スレーブ ファイル記述子をsubprocess.Popen(...)
呼び出しのstdout
,stderr
およびstdin
パラメータの引数として指定しました。で開かれたマスター ファイル記述子を読み取るとos.fdopen(...)
、別のスレッドを使用した場合と同じ結果が得られます。入力を要求する行は読み取られません。
編集: @Antti Haapala のpty.fork()
子プロセス作成の例を代わりにsubprocess.Popen(...)
使用すると、 によって作成された出力も読み取ることができるようですraw_input(...)
。
pexpect の使用
また、pexpect で生成されたプロセスのメソッド (ドキュメントはこちら) も試しましたが、 で得た最良の結果はread()
以前と同じです:read_nonblocking()
ユーザーに何かを入力してもらう前の出力の行は読んでください。で作成された PTY と同じです。入力を要求する行は読み取られます。readline()
read_nonblocking()
pty.fork()
編集:子を作成するマスタープログラムでing の代わりにsys.stdout.write(...)
andを使用すると、プロンプト行が表示されない問題が修正されたように見えましたが、実際にはどちらの場合も読み取られました。sys.stdout.flush()
print
その他
も試しましselect.poll(...)
たが、パイプまたは PTY マスター ファイル記述子は常に書き込みの準備ができているようです。
ノート
その他のソリューション
- また、新しい出力が生成されずに時間が経過したときに入力をフィードしようとすることも頭に浮かびました。ただし、プログラムが重い計算を実行している最中かどうかを知る方法がないため、これは危険です。
- @Antti Haapala が回答で述べたように、
read()
glibc のシステム コール ラッパーを置き換えて、入力をマスター プログラムに伝えることができます。ただし、これは静的にリンクされたプログラムやアセンブリ プログラムでは機能しません。(ただし、今考えてみると、そのような呼び出しはソースコードから傍受され、パッチが適用されたバージョンのread()
- に置き換えられる可能性がありますが、それでも実装するのは骨の折れる可能性があります。) - システムコールをプログラムに伝えるためにLinuxカーネルコードを変更するの
read()
は、おそらく非常識です...
PTY
PTY は端末を偽装し、あらゆる場所の端末で対話型プログラムが実行されるため、PTY が適していると思います。問題は、どうやって?
c - C - write() システムコールが pid_t の代わりに意味不明な出力をする
次のコード:
実際の pid ではなく意味不明な文字を出力します。なんで?