問題タブ [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.
c - fork/pipe/dup2 の問題: 子プロセスが終了しない
リストを頭からつま先まで調べることができるように、(または)を介してターミナルでページングできる長いリストを出力する小さなプログラムを作成したいと思います...more
less
プログラム:
fork
more
プログラムが実行される子プロセスから離れている- 親プロセスでは、リストが出力されます
- 親によって
pipe
印刷されたリストがプログラムのstdout
more
stdin
コード:
私はこれをほとんどの部分で機能させています:
- 「Hello World!...」メッセージの長いリストが a でクリップされた端末に出力される
--More--
ので、基本的なパイプのセットアップが機能していることがわかります。 [q]
リスト全体の印刷が終了する前に押すと(more
プロセスを終了する)、プログラム(親/子)が期待どおりに終了します
私が抱えている唯一の問題は、[space]
or[return]
を押し続けmore
てリストの最後 (500 番目の "Hello World!..." メッセージ) に到達すると、端末がハングすることです。押し[q]
ても反応がありません (出なければ [ctrl+c]
なりません)。
親プロセスが でスタックしていwait
ます。 親のmore
両方のパイプを閉じたにもかかわらず、プロセスが終了しません
c - pipe() および dup2() が C でどのように機能するかについての明確化
配管を処理する単純なシェルを作成しています。動作するコードはありますが、内部でどのように動作するのかよくわかりません。これは、理解するのに助けが必要な変更されたコード スニペットです (短くするためにエラー チェックを削除しました)。
質問には推測がありますが、推測はそれだけです。ここに私が持っている質問があります:
- ブロッキングはどこで実行されますか? 私が見たすべてのサンプル コードで、ブロッキング
read()
をwrite()
提供していますが、ここではそれらを使用する必要はありませんでした。パイプの読み取り側を指すように STDIN をコピーし、パイプの書き込み側を指すように STDOUT をコピーするだけです。私が推測しているのは、dup2(fd[0], 0)
実行後にSTDINがブロッキングを行っているということです。これは正しいです? - 私が理解していることから、実行中のプロセスごとに、ファイル テーブル内の開いているファイルを指す記述子テーブルがあります。プロセスが STDIN、STDOUT、または STDERR をリダイレクトするとどうなりますか? これらのファイル記述子は、すべてのプロセスの記述子テーブルで共有されていますか? それとも、プロセスごとにコピーがありますか? 1 つをリダイレクトすると、それらすべてに変更が反映されますか?
への呼び出し
/li>pipe()
とそれに続くへの呼び出しの後、fork()
開いているパイプの 4 つの「端」があります。親によってアクセスされる読み取りおよび書き込み端と、子によってアクセスされる読み取りおよび書き込み端です。私のコードでは、親の書き込み側と子の読み取り側を閉じています。ただし、パイプを使い終わった後、残りの 2 つの端は閉じません。コードは正常に動作するので、ある種の暗黙の終了が行われていると思いますが、それはすべて当て推量です。このように、残りの 2 つの端を閉じるために明示的な呼び出しを追加する必要がありますか?これは、配管プロセスがどのように機能するかについての概念的な質問です。ファイル ハンドル によって参照されるパイプの読み取り側と、ファイル ハンドル によって
fd[0]
参照されるパイプの書き込み側がありますfd[1]
。パイプ自体は、バイト ストリームによって表される単なる抽象化です。ファイルハンドルは開いているファイルを表していますよね?つまり、システムのどこかにfd[1]
、パイプを介して送信したいすべての情報が書き込まれたファイル ( で示される) があるということでしょうか? そして、バイト ストリームを介してその情報をプッシュした後、fd[0]
すべての情報が書き込まれたファイル ( で示される) が存在し、パイプの抽象化が作成されます。
c - dup2() が出力を妨げています
私のコードを以下に貼り付けます。
出力をファイルにリダイレクトするために dup2 を使用しようとしています。
リダイレクトに使用すると(コメントを削除すると)正常に動作し、標準出力ではなくファイルに出力されます。例: ls > test 、結果として ls が test に出力されます。
問題は、 > なしの ls では何も出力されないことです。リダイレクトする機能はありませんが、コメント ls 出力をそのままにしておきます。
redirect[0] は < または > のいずれかであるか、何も指定されていません。 redirect[1] はリダイレクト先のファイルのパスです。
コマンドは、コマンドのpicesを含むcstringの配列です コマンドも同様です
コードをコメントした出力例
コードのコメントを外して
shell - forループを使ったマルチパイプ
パイプとファイル リダイレクトをサポートする単純なシェルを作成しようとしています。これまでに思いついた実行関数は次のとおりです。
これを実行すると、プログラムは実行されますが、何も起こりません。私はこの機能に何日も取り組んできましたが、その理由を理解できないようです。親プロセスは子を永遠に待っていると思います。誰かがこれで私を助けてくれますか?
c++ - execp、dup2、およびパイプを使用してシェルを実装しようとすると、ハングするか、「不正なファイル記述子」が発生します
C ++でパイプを使用してシェルを実装しようとしています。コマンドは機能していますが、パイプが関与すると、機能が停止します。私が何を意味するかをお見せします。コードは次のとおりです。
単純な「ls」などの単一パイプ コマンドを実行すると、正常に動作します。ただし、 ls | を使用すると ソートすると、次のエラー メッセージが表示されます。
そして、そこから出るまでハングします。パイプを何らかの形で(パイプを閉じないで)誤って処理したことがハングアップの原因だと思いますが、それをどこに何回入れるかわかりません。なんとなく。私はこれらの関数 (dup2、fork、execp、pipe など) のほとんどすべてに慣れていないので、推測とチェックは 6 ラウンドのロシアン ルーレットに似ていると感じています。
とにかく、どんな助けでも大歓迎です。ありがとう!