問題タブ [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 - Linux/C: パイプを STDIN/STDOUT にリダイレクトする
Cプログラムでシェルスクリプト「env | grep HOME」をシミュレートするのに苦労していました。29 行目をコメントアウトするとこの問題が解決することがわかりましたが、その理由はよくわかりません! dup2() が子の fd を閉じていたことが原因であるという別の質問を読みましたが、man ページにはそれが示されていません。誰かが私に決定的な理由を与えて、この行動を理解するのを助けることができますか? ありがとうございました!
c - execvp から stdout をファイルに書き込む
execvp がリダイレクトされた STDOUT に書き込んでいないのはなぜですか? このブロック内のテストとして printf() を使用してみましたが、STDOUT をリダイレクトしたファイル内の正確な場所に書き込みます。
編集: コードを変更し、makesubcommand の実装を追加し、デバッグ メッセージをいくつか追加しました。
ここに makesubcommand(4) があります:
ここにテストランがあります:
c - dup2 使用時の競合状態
dup2
システムコールのこのマンページは次のように述べています。
EBUSY (Linux のみ) これは、open(2) および dup() との競合状態中に dup2() または dup3() によって返される場合があります。
それはどのような競合状態について話し、エラーが発生した場合dup2
はどうすればよいですか? EBUSY
の場合のように再試行する必要がありEINTR
ますか?
c - 複数の子プロセスを持つ C の読み書き
C の親プロセスから、それぞれプログラムを実行する 3 つの子プロセスを実行しています。
- プログラム 1 は stdin (ユーザー入力) を取得し、それを stdout に出力します。
- プログラム 2 は標準入力 (プログラム 1 から取得する必要があります) を取得し、それを変更して標準出力に出力します。
- プログラム 3 は標準入力 (プログラム 2 から取得する必要があります) を取得し、それを変更して標準出力に出力します。
program3 の出力を取得していますが、プログラム 2 の変更は表示されません。
以下は、親からの関連コードです。
プログラムは、読み取り/書き込みに fgets と printf を使用しています。
以前の質問を確認しましたが、何が間違っているのかわかりませんでした。何か案は?
c - Cでdup2()は何をしますか
マニュアルページで調べましたが、まだわかりません...
あなたが持っているとしましょうdup2(f1,0)
。filedesc.1 を stdin に切り替えてから、stdin をロックしますか?
c - dup2 を使用して stdout/stderr を同じファイルにリダイレクトする際の問題
と の両方を同じ出力ファイルdup2
にリダイレクトしようとすると、問題が発生します。stdout
stderr
この説明用のコード サンプルを使用しています: (gcc 4.8.2、Ubuntu 14.04)
USE2FILES マクロは、stdout
と にそれぞれ複製される 2 つのファイル記述子 (同じファイルへの) を使用するか、とのstderr
両方に複製される 1 つのファイル記述子を使用するかを切り替えることになっています。stdout
stderr
リダイレクトに 2 つの異なるファイル記述子を使用するとうまくいくはずだという印象を受けました。ただし、このコードを USE2FILES on で実行すると、次の出力が に出力されtest.out
ます。
次に USE2FILES を無効にすると、次のようになります。
最初のケースでは出力stderr
が通過しないようです。この動作は予期されるものですか (何か不足していますか)?
編集:クリス・ドッドの答えを受け入れた後:それは確かに悪い例です。fprintf
シーケンスを次のように変更します。
test.out
この出力を取得します:
かなりはっきりstdout
と表示stderr
され、同じファイルに対する書き込みと競合しています。