質問

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)が役立ちます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top