2016-07-11 4 views
0

私はちょうど低レベルのものとCを学び始めた初心者です。これは愚かな質問かもしれませんが、私はファイル記述子について戸惑っています。それらをコピーするには、システムコールdup2()またはdup()が必要であることを理解しています。しかし、古い値を新しい変数に代入するだけではコピーできないのはなぜですか?整数をf [0]、[1]特定の意味を持っている、とエンコードのいくつかの並べ替えですfはそのため例えば、なぜ我々はこれを行うことができますファイル記述子を新しい変数に明示的に割り当てるだけでコピーできないのはなぜですか?

int f[2]; 
pipe(f); // I call pipe just to create two file descriptors, nothing special 
int new_descriptor = f[0]; // this line is where I'm confused 

はされますか? ありがとう!

+0

'dup'は、同じファイルを指す新しいfdを作成して返します。 fdはプロセスファイルテーブルへのインデックスであるため、 'dup'は実際にプロセスファイルテーブル上の次のオープンスポットを見つけ、ポインタを(カーネル内の)ファイル構造体にコピーしてユーザ空間に返します。 – evaitl

答えて

4

割り当てによってファイル記述子をコピーできます。あなたができないのは、特定のファイルディスクリプタ番号(1など)が参照するファイルを変更することです。これを行うには、dup()またはdup2()-またはfcntl()またはclose()が必要です。 (。このようopen()pipe()として呼び出す任意既に開いているファイル記述子には影響を与えません。彼らが使用されていない以前に、新しいものを返す)それを見て

一つの方法:ファイルを保持する変数について独特のものはありません記述子番号 - 同じ番号を保持する任意のint変数をファイル記述子として使用できます。しかし、ファイル記述子が参照するファイルを変更することははるかに複雑な作業であり、システムコールが必要です。

+0

私はそれを今得ます!はっきりと説明してくれてありがとう! :) –

+0

偉大な答え。 'dup'や' dup2'を呼び出すと、開いているファイルの参照カウントが増加するので、元のファイル記述子を閉じるとファイルは閉じず、 'dup'が返す新しいファイル記述子を使ってアクセスできますファイルは、参照カウントが0に達すると閉じられます)。 – Myst

+0

@Myst:正しいですが、私はオープンファイル記述子とオープンファイル記述子の違いを明確にすることを計画していましたが、両方ともオープンファイルとは別です。なぜなら、 。 –

関連する問題