基になるファイル記述子を閉じずにFILEポインターを閉じます
質問
fdopen()
、 fileno()
を使用すると、既存のファイル記述子でストリームを開くことができます。ただし、ストリームでファイルを開いたら、ファイルを閉じる適切な方法は、 FILE
ポインターを fclose()
することです。どうすればストリームを閉じることができますが、開いているファイル記述子を保持できますか?
この動作は、 fflush()
を呼び出してから fileno()
を呼び出し、次に FILE
ポインターを再び使用することと似ていますが、閉鎖。もう1つの懸念は、再度 fdopen()
を実行すると、複数の FILE
ポインターが存在し、そのうちの1つしか閉じることができないことです。
解決
POSIXyシステムを使用している場合( fileno()
があるため、これを使用していると思われます)、 dup()
を使用して、ファイル記述子を複製します。
int newfd = dup(fileno(stream));
fclose(stream);
または fdopen()
に重複したファイル記述子を渡すことができます:
FILE *stream = fdopen(dup(fd), "r");
どちらにしても、fdのもう一方のコピーは FILE *
で閉じません。ただし、ロケーションポインターは 共有されることに注意してください。そのため、両方を同時に使用する場合は注意してください。また、元のfdに保持されている fcntl()
のロックは、コピーを閉じると 解除されます。
他のヒント
他のすべてが失敗した場合、dup(2)が役立ちます。
所属していません StackOverflow