問題タブ [dup2]
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 - Pythonのdup、dup2、tmpfile、およびstdout
これはhereからのフォローアップの質問です。
行きたいところ
Pythonがまだ標準出力に出力できる間に、標準出力を一時ファイルに一時的にリダイレクトできるようにしたいと考えています。これには、次の手順が含まれます。
- stdout のコピーを作成します (
new
) - 一時ファイルを作成する (
tmp
) - stdout をリダイレクトする
tmp
new
stdout として使用するように Python に指示するtmp
「実際の」stdout にリダイレクトする- 「本物の」stdout を再度使用するように Python に指示します。
- 読んで閉じる
tmp
実装
上記を次の方法で実装しようとしました。
ここで少し休憩してまとめたいと思います。
ここまでのコンソールへの出力は次のようになります。
whilesil
次のようになります['0.3\n']
。したがって、ここまですべてが魔法のように機能しています。ただし、上記のスクリプトをもう一度やり直すと、次のようになります。
エラーが発生し、出力は次のようになります。
whilesil
読み取り: ['0.3\n', '']
.
つまり、2 番目Func("1.3", True)
は一時ファイルに書き込むことができません。
質問
- まず、スクリプトが動作したいように動作しない理由を知りたいです。つまり、一時ファイルへの書き込みがスクリプトの前半でしかできないのはなぜですか?
dup
との使い方にはまだ少し戸惑っていますdup2
。stdout の一時ファイルへのリダイレクトがどのように機能しているかは理解していると思いますが、なぜos.dup2(new, 1)
それが何をしているのかが完全にわかりました。おそらく、答えは、スクリプト内のすべてのdup
anddup2
s が何をしているのかについて詳しく説明できるかもしれません^^
unix - dup2 と fork をどのように併用しますか?
私はオペレーティング システムのコースを受講していますが、フォークがある場合に dup2 で入力をリダイレクトする方法に苦労しています。この小さなプログラムを書いて感覚をつかもうとしましたが、孫の出力を子に渡すことに成功しませんでした。unix コマンドを模倣しようとしています: ps -A | トイレ -l。私は Unix を初めて使用しますが、取得した実行中のプロセスのリストの行数をカウントする必要があると思います。したがって、私の出力は単一の数値になるはずです。
上記のコードにはありませんが、どのようにダウンするかについての私の推測は次のとおりです。
- コマンド ps -A の標準出力 (通常、画面に表示されるものは何でも正しいですか?) をリダイレクトして、 wc -l コマンドが行数をカウントできるようにする必要があります。
- この標準出力は、標準出力を ? にリダイレクトすることを意味する dup2( ?, 1 ) のように、dup2 を使用してリダイレクトできます。次に、閉じますか?
質問: どこにリダイレクトしますか? ファイル記述子の1つである必要があることはわかっていますが、wcが処理できるようにどこにリダイレクトする必要がありますか?
- wc は何らかの方法で標準出力を受け取ります。
質問: wc はどのように出力を受け取りますか? execlp パラメーターを介して? または、オペレーティング システムはファイル記述子の 1 つをチェックしますか?
- wc -l を実行します。
wc が ps の出力を受け取って処理するために閉じられ、開いたままになっているのはどれですか? ps はその出力を wc に渡す必要があるため、これは逆に考える必要があると考え続けています...しかし、子と孫の両方が並行して処理されているため、それは意味がないようです。
c - Cでパイプ、dup2、ファイル記述子を閉じますか?
パイピングを行うプログラムを実行しています。実行したいコマンドは ls | です。猫。
コードを実行すると、コマンド ls | cat は正常に動作しますが、cat は終了しません (つまり、パイプは閉じず、何もせずにそこで待機します)。ストリームか何かを閉じていなかったことが原因だと思いますが、C/IO に精通していないため、確実に知ることができません。私はこれを正しく行っていますか?
この関数を実行するコードは次のようになります
編集:あなたは正しい、致命的なエラー、私は引数を間違って入力しました
thxs、親のパイプ[1]を閉じる必要があったようです
c - dup2 / closeを正しく使用してこれら3つのプロセスを接続するにはどうすればよいですか?
プロセス間通信を可能にするために、3つのプロセスを適切に接続しようとしています。親のSTDINを取得し、ストリーム内の単語を処理するスキャナーという1つのプロセスがあります。単語の長さが奇数の場合は1つのプロセスに送信され、偶数の場合は別のプロセスに送信されます。これらのプロセスは、STDIN(私が推測する)を介してこれらの単語を受け取り、STDOUTを介してスキャナープロセスに情報を出力する必要があります。偶数/奇数のSTDOUTをスキャナーにリダイレクトする必要があります。スキャナーは、(読み取りを使用して)読み取り、単語を出力/処理します。これは学術的な演習であり、実践的な演習ではありません。写真は次のようになります。
これが私のコードが現在どのように見えるかです。問題は、何を複製し、何を閉じるかが正確にわからないことです。私がそれを理解したら、私は行ってもいいはずです!何かアドバイスをいただければ幸いです。
ファイル記述子:
コード:
c - dup2 を使用して C プログラムに 'ls /bin | グレップ グレップ | grep b'
dup2 を使用して ac プログラムに などのコマンドを実行させるのに問題がありls /bin | grep grep | grep b
ます。3 番目のコマンドと関連するパイプをコメント アウトすると、正常に実行さls /bin | grep grep
れますが、最後のコマンドではすぐに戻ります。また、「ps」と入力しても、プロセスはまだ実行中です。パイプの締め方が原因だと思います。私のコードは以下の通りです:
c - dup2を使用してstdinとstdoutをリダイレクトする未定義のエラー
パイプを使用して、子プロセスのstdinとstdoutをリダイレクトしたいと思います。
現在、私は次のコードを持っています:
ただし、このコードは取得し続けるため機能しません
dup2 pipeOut:未定義のエラー:0
そして、それはデッドロックに陥ります。
親が子の応答(決して到着しない)を待ち続け、同じように子が決して到着しない入力を待ち続けるため、コードが停止することを理解しています。
私が理解していないのは、なぜ私がそのエラーを受け取り続けるのかということです。私は何か間違ったことをしていますか?
私はMacOSLion10.7.2とXcode4.2.1に取り組んでいます。
更新:Adam Rosenfieldの回答の後、ifステートメントを修正しました。しかし、私が言ったように、コードはまだ停止しています(私は子供が最初に印刷したものだけを読むことができ、他にはChild: Parent Message
何も読むことができません)。
なぜこれが起こっているのか考えていますか?
c - Cのpipe/dup2を介して子プロセスにコマンドを送信する
rasperry Pi で omxplayer のリモート コントロール プログラムを作成しようとしています。
子プロセスで omxplayer を正常に実行させることはできますが、実際にコマンドを子プロセスに送信するためにパイプを正しく動作させることができないようです。
top でテストしてプログラムを実行すると、ターミナル ウィンドウに top の出力が表示され、ウィンドウに q コマンドが表示されますが、子プロセスではなく親プロセスに移動しているように見えます。パイプに何か問題がありますか、それとも生成された子プロセスにコマンドを送信できませんか?
子の dup2 ステートメントをパイプから stdin にコピーするように変更してみました
しかし、トップは失敗した tty get メッセージで起動に失敗します
c - なぜdup2がここで機能するのでしょうか?
このコードクリップはAPUEから入手しました。
これにより、すべての出力、stderr、およびstdoutがリモートソケットにリダイレクトされます。リモートソケットは、clfdを介して書き込み可能です。
しかし、それはどのように機能するでしょうか?2つのFDを1つのFDにリダイレクトしています。
linux - dup2 を使用して手動パイピングを複製すると、説明のつかない動作が発生する
動作するものと動作しないもののようなものを実行しようとする 2 つのコード セットがありますls|grep pip
。
作業コードは2つの子プロセスを作成し、それぞれ1つの子を使用して1つのコマンドを実行し、もう1つは1つの子を作成してこれを実行しようとします。つまり、子で ls を実行し、親で grep を実行します。これはうまくいかないようです。また、エラーも発生しないようです。
誰かが私に何が問題なのか教えてもらえますか? そして、なぜそれが存在するのですか?
動作しない:
コードは次のとおりです。
働く:
fork - dup2 は printf をブロックしますが、fprintf はブロックしませんか?
そのため、オペレーティング システム クラスの割り当てがあり、パイプで接続されたプロセスのリングを作成して、プロセス間でメッセージを渡す必要があります。私は、自分のニーズに合わせて (または少なくとも理解するために) 適応しようとしていたサンプル コードを見つけました。サンプル コード (少し変更) は次のとおりです。
出力:
私が与えるときはargv [1]として2です
では、なぜ dup2 セクションが printf() の実行を妨げるのでしょうか? 何かを印刷することさえできない場合、メッセージを正しく渡すことさえできるかどうかわかりません。また、なぜ fprintf() が既に機能しているのに、私がそこに置くものではないのですか?
編集:私はこれを私の教授/TAに持って行きますが、彼らは町の外にいて、今から締め切りまでの間は連絡が取れません...