[解決済み] dup2 / dup - なぜファイルディスクリプタを複製する必要があるのでしょうか?
疑問点
の使い方を理解しようとしています。
dup2
と
dup
.
man ページから :
DESCRIPTION
dup and dup2 create a copy of the file descriptor oldfd.
After successful return of dup or dup2, the old and new descriptors may
be used interchangeably. They share locks, file position pointers and
flags; for example, if the file position is modified by using lseek on
one of the descriptors, the position is also changed for the other.
The two descriptors do not share the close-on-exec flag, however.
dup uses the lowest-numbered unused descriptor for the new descriptor.
dup2 makes newfd be the copy of oldfd, closing newfd first if necessary.
RETURN VALUE
dup and dup2 return the new descriptor, or -1 if an error occurred
(in which case, errno is set appropriately).
なぜそのようなシステムコールが必要なのでしょうか? ファイルディスクリプタを複製することに何の意味があるのでしょうか?
ファイル記述子があるのなら、なぜそのコピーを作りたいのでしょうか?
私はあなたが説明し、私に例を与えることができれば感謝します。
dup2
/
dup
が必要です。
ありがとうございます
どのように解決するのですか?
dup システムコールは、既存のファイル記述子を複製し、同じ基礎となる I/O オブジェクトを参照する新しいものを返します。 同じ基礎となる I/O オブジェクトを参照します。
Dup は、シェルがこのようなコマンドを実装することを可能にします。
ls existing-file non-existing-file > tmp1 2>&1
2>&1 は、シェルに、コマンドに、記述子 1 の複製であるファイル記述子 2 を与えるように指示します。(すなわち、stderr と stdout は同じ fd を指す)。
ここで
ls
を呼び出した場合のエラーメッセージです。
存在しないファイル
という正しい出力と
ls
で
既存のファイル
で表示されます。
tmp1
ファイルに表示されます。
次のサンプルコードは、標準入力がパイプの読み込み側に接続された状態で、プログラムwcを実行します。 をパイプの読み込み側に接続して実行します。
int p[2];
char *argv[2];
argv[0] = "wc";
argv[1] = 0;
pipe(p);
if(fork() == 0) {
close(STDIN); //CHILD CLOSING stdin
dup(p[STDIN]); // copies the fd of read end of pipe into its fd i.e 0 (STDIN)
close(p[STDIN]);
close(p[STDOUT]);
exec("/bin/wc", argv);
} else {
write(p[STDOUT], "hello world\n", 12);
close(p[STDIN]);
close(p[STDOUT]);
}
子は読み込み終了をファイル記述子 0 にダンプし、p のファイル記述子を閉じます。
スクリプタを閉じ、wc を実行する。wc が標準入力から読み込むとき、それはパイプから読み込む。
パイプから読み込む。
これは、パイプがdupを使用して実装されている方法です。さて、dupの1つの使用は、他の何かを構築するためにパイプを使用して、システムコールの美しさです。
最終的には、システムコールはカーネルで得られる最も基本的なツールです。
乾杯 :)
関連
-
[解決済み】ENOENTが「そのようなファイルやディレクトリはありません」という意味であるのはなぜですか?
-
C 構造体定義エラー: '['トークンの前に一次式があることが予想される
-
g++が内部・外部コマンドソリューションとして認識されない、MinGWを初めて使うときの落とし穴
-
関数 'malloc' の暗黙の宣言に対する解決策
-
initializer element is not constant "というエラーが表示されるのですが?
-
エラー: 宣言されていない識別子 'bool' の使用と C コンパイラでの問題点
-
[解決済み] Code::Blocks アプリケーションをコンパイルできない
-
[解決済み] プログラム終了前にmallocの後にfreeをしないと本当に何が起こるのか?
-
[解決済み] longをフォーマットするprintfの引数は何ですか?
-
[解決済み] C言語の構造体(CGRectやCGPointなど)をNSLog化することは可能ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
解決済み] g++ コンパイルエラー: ')'トークンの前に一次式があることが予想される
-
g++が内部・外部コマンドソリューションとして認識されない、MinGWを初めて使うときの落とし穴
-
[解決済み] C言語でchar配列をコピーする方法は?
-
[解決済み] C言語の**はどういう意味ですか?
-
[解決済み] C言語では「?」演算子は何をするのですか?
-
[解決済み] mallocとcallocの違い?
-
[解決済み] なぜ16進数には0xがつくのですか?
-
[解決済み] フリーは、どのように無料化を知っているのですか?
-
[解決済み] なぜalloca()の使用はグッドプラクティスとみなされないのでしょうか?
-
[解決済み] ストラクチャーとユニオンの違い