問題タブ [pipe]
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.
python - os.pipe および os.fork() の問題を使用する Python プログラム
最近、os.fork()を実行して 2 つのプロセスに分割するスクリプトを作成する必要がありました。子プロセスはサーバー プロセスになり、os.pipe()で作成されたパイプを使用して親プロセスにデータを返します。通常どおり、子が'r'
パイプの端を閉じ、親がパイプの端を閉じます。'w'
pipe() からの戻り値をos.fdopenでファイル オブジェクトに変換します。
私が抱えている問題は次のとおりです。プロセスが正常に分岐し、子がサーバーになります。'w'
すべてがうまく機能し、子供はパイプの開いた端にデータを忠実に書き込みます。残念ながら、パイプの親エンドは 2 つの奇妙なことを行います: A) パイプのエンドでの操作を
ブロックします。次に、パイプの端が完全に閉じ
られていない限り、パイプに置かれたデータを読み取ることができません。read()
'r'
'w'
私はすぐにバッファリングが問題であると考え、pipe.flush()呼び出しを追加しましたが、これらは役に立ちませんでした。
書き込み終了が完全に閉じられるまでデータが表示されない理由を誰かが明らかにすることはできますか? read()
そして、呼び出しをブロックしないようにする戦略はありますか?
これは、パイプを分岐または使用した初めての Python プログラムなので、単純な間違いを犯した場合はご容赦ください。
unix - パイプを通常のファイルに変更できません
次のファイル(上記)があります。これは、Unixパイプの 代替テキストのようですhttp://dl.getdropbox.com/u/175564/problemFile.png
パイプをデフォルトのテキストファイルにするにはどうすればよいですか?
windows - Windows でパイプとファイルを区別する
Unix では、すべてがファイルであるため、パイプ、ファイル、ソケットなどでファイル I/O 関数を使用できます。しかし、Windows では、使用する API は、使用する I/O HANDLE のタイプによって異なります。
私の質問は: HANDLE が与えられた場合、基になる型が何であるかをどのように判断しますか? たとえば、実ファイルまたは名前付き/匿名パイプの HANDLE があります。この HANDLE で PeekNamedPipe を呼び出せるかどうかを知りたいです。
c++ - stderr が出力をファイルに送信しているかどうかを確認する方法は?
stderr が C/C++ プログラム内のファイルまたは端末に出力しているかどうかを確認する方法はありますか? プログラムが次のように呼び出されるかどうかに応じて、異なるエラー メッセージを出力する必要があります。
。/プログラム
または好き:
./プログラム 2>> ファイル
unix - -c フラグの使用時に Dtrace 出力をリダイレクトする方法は?
-C フラグを指定してスクリプトを実行しているときに、Dtrace の出力のみをリダイレクトするにはどうすればよいですか?
この場合のように:
注:投稿する前に質問への回答を見つけましたが、SOの一部であるため、ここに掲載しています。
python - subprocess.Popen から返されたファイル ハンドルをポーリングする方法はありますか?
私がこれを書いたとしましょう:
今私がするなら
私のプログラムは、サブプロセスが次の行を出力するまで待機します。
出力がある場合は出力を読み取ることができるようにするためにできる魔法はありますp.stdout
が、それ以外の場合は続行しますか? 私は次のようなものを探していますQueue.get_nowait()
を読み取るためのスレッドを作成できることはわかってp.stdout
いますが、新しいスレッドを作成できないと仮定しましょう。
c - Linux の splice(2) は、TCP ソケットからスプライシングするときに機能しますか?
私は楽しみのために Linux 上の C で TCP 経由でファイルを転送する小さなプログラムを書いています。プログラムは、ソケットからファイルを読み取り、それをファイルに書き込みます (またはその逆)。私はもともと読み取り/書き込みを使用しており、プログラムは正しく動作していましたが、スプライスについて学び、試してみたいと思いました。
私が splice で書いたコードは、標準入力 (リダイレクトされたファイル) から読み取って TCP ソケットに書き込むときには完全に機能しますが、ソケットから読み取って標準出力に書き込むときに、splice が errno を EINVAL に設定するとすぐに失敗します。マニュアルページには、どちらの記述子もパイプではない場合 (そうでない場合)、シークできないストリームにオフセットが渡された場合 (オフセットが渡されなかった場合)、またはファイルシステムがスプライシングをサポートしていない場合に EINVAL が設定されると記載されています。私の質問に: これは、TCP がパイプから接続できるが、接続できないことを意味しますか?
何か間違ったことをしたことを願って、以下のコード (エラー処理コードを除く) を含めます。これは、ウィキペディアの splice の例に大きく基づいています。
splice_all
余談ですが、パイプがいっぱいになったためにファイルが十分に大きい場合(?)、上記は最初にブロックされると思います。そのため、パイプfork
から読み書きするコードのバージョンもあります。同じ時間ですが、このバージョンと同じエラーがあり、読みにくくなっています。
編集: 私のカーネルのバージョンは 2.6.22.18-co-0.7.3 です (XP で coLinux を実行しています)。
c - Unix でパイプとファイルを区別する
FILE* が与えられた場合、基になる型を特定することは可能ですか? つまり、FILE* がパイプかソケットか、通常のディスク上のファイルかを教えてくれる関数はありますか?
bash - シェル スクリプトがパイプを介して実行されているかどうかを検出するにはどうすればよいですか?
標準出力が端末に送信されているか、別のプロセスにパイプされているかをシェルスクリプト内から検出するにはどうすればよいですか?
適切な例: 出力を色付けするためにエスケープ コードを追加したいのですが、対話的に実行する場合のみであり、パイプされた場合はそうでls --color
はありません。