2009-10-21 17 views
12

fdopen()を使用すると、既存のファイル記述子でストリームを開くことができます。しかし、ファイルを閉じるための適切な方法は、ストリームで開くとfclose()FILEポインタになります。どのようにしてストリームを閉じることができますが、開いているファイル記述子は保持できますか?基礎となるファイル記述子を閉じずにFILEポインタを閉じる

この動作は、fflush()を呼び出してからfileno()を呼び出すのと似ていますが、閉じるときを除いてFILEポインタを再び使用することはありません。もう1つの懸念は、fdopen()を再度実行すると、FILEポインタが複数あり、そのうちの1つのみを閉じることができるということです。

答えて

18

あなたは(私はあなたがfileno()を持っているので、あなたが、あると仮定)POSIXyシステムにしている場合は、ファイルディスクリプタクローンを作成するdup()を使用することができます。

int newfd = dup(fileno(stream)); 
fclose(stream); 

をそれとも、重複するファイルをfdopen()渡すことができます記述:

FILE *stream = fdopen(dup(fd), "r"); 

いずれかの方法で、FDの他のコピーがFILE *を閉じません。ただし、場所ポインタが共有されているので、両方を同時に使用している場合は注意してください。また、オリジナルのfd に保持されているfcntl()のロックは、コピーを閉じるときににリリースされます。

+0

windowsおよびその他のプラットフォームはfileno()をサポートしています! 私はこのdup()解決策を考えていなかったとは思えません。非常にエレガントで明白です。 –

+0

新しいfdを元のfdに戻してdup2()する必要はありませんか?ファイルストリームが閉じられていることを除いて、すべてが元の状態に戻ります。 :Dこれは、fclose()を実行する前にoldfd = fileno(stream)が必要であることを意味します。 –

+0

ジョナサンは、マルチスレッドのアプリケーションでは手ごわいです。 fdを 'fdopen'に与える前に' dup'する方が良いので、あなたのオリジナルに触れることは絶対にありません。 – bdonlan

1

その他すべてが失敗した場合は、dup(2)が役立ちます。

関連する問題