21

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

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

4

2 に答える 2

25

あなたが POSIXy システムをfileno()使用dup()している場合 (.

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

またはfdopen()、重複したファイル記述子を渡すことができます:

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

いずれにせよ、fd のもう一方のコピーは . で閉じませんFILE *。ただし、ロケーション ポインタ共有されていることに注意してください。両方を同時に使用する場合は注意してください。また、fcntl()元の fd で保持されていたロック、コピーを閉じると解放されます。

于 2009-10-21T22:09:32.530 に答える
1

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

于 2009-10-21T22:10:16.953 に答える