問題タブ [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.

0 投票する
1 に答える
2041 参照

c - Linux/C: パイプを STDIN/STDOUT にリダイレクトする

Cプログラムでシェルスクリプト「env | grep HOME」をシミュレートするのに苦労していました。29 行目をコメントアウトするとこの問題が解決することがわかりましたが、その理由はよくわかりません! dup2() が子の fd を閉じていたことが原因であるという別の質問を読みましたが、man ページにはそれが示されていません。誰かが私に決定的な理由を与えて、この行動を理解するのを助けることができますか? ありがとうございました!

0 投票する
1 に答える
790 参照

c - execvp から stdout をファイルに書き込む

execvp がリダイレクトされた STDOUT に書き込んでいないのはなぜですか? このブロック内のテストとして printf() を使用してみましたが、STDOUT をリダイレクトしたファイル内の正確な場所に書き込みます。

編集: コードを変更し、makesubcommand の実装を追加し、デバッグ メッセージをいくつか追加しました。

ここに makesubcommand(4) があります:

ここにテストランがあります:

0 投票する
2 に答える
1909 参照

c - dup2 使用時の競合状態

dup2システムコールのこのマンページは次のように述べています。

EBUSY (Linux のみ) これは、open(2) および dup() との競合状態中に dup2() または dup3() によって返される場合があります。

それはどのような競合状態について話し、エラーが発生した場合dup2はどうすればよいですか? EBUSYの場合のように再試行する必要がありEINTRますか?

0 投票する
1 に答える
3037 参照

c - 複数の子プロセスを持つ C の読み書き

C の親プロセスから、それぞれプログラムを実行する 3 つの子プロセスを実行しています。

  • プログラム 1 は stdin (ユーザー入力) を取得し、それを stdout に出力します。
  • プログラム 2 は標準入力 (プログラム 1 から取得する必要があります) を取得し、それを変更して標準出力に出力します。
  • プログラム 3 は標準入力 (プログラム 2 から取得する必要があります) を取得し、それを変更して標準出力に出力します。

program3 の出力を取得していますが、プログラム 2 の変更は表示されません。

以下は、親からの関連コードです。

プログラムは、読み取り/書き込みに fgets と printf を使用しています。

以前の質問を確認しましたが、何が間違っているのかわかりませんでした。何か案は?

0 投票する
1 に答える
21703 参照

c - Cでdup2()は何をしますか

マニュアルページで調べましたが、まだわかりません...

あなたが持っているとしましょうdup2(f1,0)。filedesc.1 を stdin に切り替えてから、stdin をロックしますか?

0 投票する
1 に答える
2325 参照

c - dup2 を使用して stdout/stderr を同じファイルにリダイレクトする際の問題

と の両方を同じ出力ファイルdup2にリダイレクトしようとすると、問題が発生します。stdoutstderr

この説明用のコード サンプルを使用しています: (gcc 4.8.2、Ubuntu 14.04)

USE2FILES マクロは、stdoutと にそれぞれ複製される 2 つのファイル記述子 (同じファイルへの) を使用するか、とのstderr両方に複製される 1 つのファイル記述子を使用するかを切り替えることになっています。stdoutstderr

リダイレクトに 2 つの異なるファイル記述子を使用するとうまくいくはずだという印象を受けました。ただし、このコードを USE2FILES on で実行すると、次の出力が に出力されtest.outます。

次に USE2FILES を無効にすると、次のようになります。

最初のケースでは出力stderrが通過しないようです。この動作は予期されるものですか (何か不足していますか)?

編集:クリス・ドッドの答えを受け入れた後:それは確かに悪い例です。fprintfシーケンスを次のように変更します。

test.outこの出力を取得します:

かなりはっきりstdoutと表示stderrされ、同じファイルに対する書き込みと競合しています。