問題タブ [dup]
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++ - dup はリダイレクトしません
stdout をファイルにリダイレクトするコード (ls の結果がファイルに返されるなど) を書いていますが、dup2() 関数は出力をリダイレクトしません。これが私が持っているコードです:
そして、これは機能しません。ls の出力を端末ウィンドウに表示するだけです。dup2() が実際に -1 ではなく 1 を返したことを確認するための手順を実行しました。
c - fork、pipe exec、および dub2
このコードは、「'ls -l' からの出力:」を出力し、'ls -l' の結果を追加することになっていますが、そうではありません。
c - fork() が dup2() によってファイル記述子の 1 つを閉じる理由
dup2() を理解するためのコードを書きました。
lsof は 2 つの開いているファイル記述子を示しています (/workspace/source/throw.cpp は渡された引数です)
しかし、私はそれを 2 つのプロセス (以下のコード) に fork() しますが、開いている /workspace/source/throw.cpp は 1 つだけです。
- 質問 1: dup()d fd が閉じられた原因は何ですか?
- 質問 2: マニュアルで FD_CLOEXEC を調べましたが、fcntl() で設定しないでください。fopen() は自動的に設定しますか? このフラグは fork だけでなく exec ファミリにも影響しますか?
質問 3: dup2 を dup に置き換えた後、結果は予想どおり 2 fds を示しています。マニュアルが言ったように:
「dup2() は newfd を oldfd のコピーにし、必要に応じて newfd を最初に閉じます」。
newfdがすでに開いている場合、dupの前にnewfdを閉じることを意味しますか?
c - ソケット経由の execvp 出力のストリーミング
この質問が何十億回も聞かれていることは知っていますが、すべての解決策がうまくいくわけではありません。をソケット経由でクライアントにストリーミングする必要がありstdout
ます。execvp
関連するクライアントコードはこれです
この質問の回答をコピーしようとしました。ただし、次のコードを試しても何も返されません。
接続が正しく確立されていることをトリプルチェックしました。execute_cmd
シンプルに置き換えるとwrite
、クライアントは答えを正しく出力します。しかし、上記のコードを実行しても何も起こりません。バイトが返されません。呼び出しを削除しましたが、dup2
呼び出しからの出力もありませんexecvp
。
ここでかなり必死になって、pipe
私が見つけたものは何でも試してみました。どこで私は間違えましたか?コマンド自体も問題なく、シェルで動作し、execvp
呼び出しはエラーをスローしません。
linux-kernel - 真のファイル記述子のクローン
ディスクファイルの場合のように、可能な場合に真のファイル記述子クローンメカニズムがないのはなぜですか。
POSIX:
これらのシステム コールの 1 つから正常に戻った後、古いファイル記述子と新しいファイル記述子を交換可能に使用できます。これらは同じオープン ファイル記述 (open(2) を参照) を参照するため、ファイル オフセットとファイル ステータス フラグを共有します。たとえば、記述子の 1 つで lseek(2) を使用してファイル オフセットを変更すると、もう一方のオフセットも変更されます。
ウィンドウズ:
複製ハンドルは、元のハンドルと同じオブジェクトを参照します。したがって、オブジェクトへの変更は両方のハンドルを介して反映されます。たとえば、ファイル ハンドルを複製した場合、現在のファイル位置は両方のハンドルで常に同じになります。ファイル ハンドルが異なるファイル位置を持つようにするには、CreateFile 関数を使用して、同じファイルへのアクセスを共有するファイル ハンドルを作成します。
クローン プリミティブを使用する理由:
ファイル アーカイブを操作する場合、アーカイブ内の各ファイルに個別にアクセスできる必要があります。ファイル アーカイブは、仮想ファイル システムのように動作する必要があります。
ファイルタイプのチェック。ファイル オフセットのクローンを作成できるため、元の位置に影響を与えることなく、ファイルのごく一部を読み取ることができます。
c - コマンド配列によるパイピング
文字列の配列と配列のサイズを取る関数があります。文字列をコマンドと引数にトークン化し、コマンドを 1 つずつフォークして実行するループがあります。コマンドごとに、出力を次のコマンド入力にパイプする必要があります。dup/close 呼び出しが正しいかどうかは完全にはわかりません。どんな助けでも大歓迎です。配列にコマンドが1つしかない場合はパイプしないように設定しています。
ruby - Ruby オブジェクト ID、複製、可変性
Rubyで次の懸念に遭遇しました
だから、私はこれについてある程度理解しています。a
で配列への参照を保持しますobject_id
。
b
b
は、その を参照するポイントとしてa
、その同じ位置への参照も持っていobject_id
ます。基本的には同じものを指します。したがって、何かを変更するとb
、a
も変更されます。
この動作はどのカテゴリに分類されますか? これに関連して将来エラーが発生しないように、記憶できる読み物/一般的な慣行はありますか? 私はそれa.dup
が別の場所に新しいオブジェクトを提供することを知っているa.dup == b
のでtrue
. にもa.dup.object_id == b.object_id
。
また、浅い対深いに関係なく、この状況では本質的に同じことですかdup
?clone
c - c 重複未定義エラー
2 つの子プロセスを作成しようとしています。
1 つの子は、引数として渡されたファイルから入力を読み取り、出力をパイプに書き込みます。
もう 1 つの子はパイプから出力を読み取り、その出力をファイルに書き込みます。これも引数として渡されます。
親は子のファイル記述子の一部を設定し、子が作成されると、必要に応じて記述子の操作を終了します。
ただし、ファイル記述子の設定に問題があります。具体的には、入力ファイル記述子を閉じて複製して標準入力の代わりに使用しようとすると、問題が発生します。
ここにすべての私のコードがあります:
これをMINIX3でコンパイルして実行しています。
プログラム出力を含め、実行方法は次のとおりです。
どんな助けでも大歓迎です。