1

FILE*オブジェクトを渡す特定のクロスプラットフォーム ライブラリを使用する必要があります。

別のソース (継承) からファイル記述子を取得します。複数のプロセスで同じfd状態を維持したいと考えています。fork

現在、ファイル記述子をオブジェクトfdopenに変換するために使用しています。FILE*

私の問題は、オブジェクトのfcloseクリーンアップに使用すると、FILE*接続されたファイル記述子が閉じられることです。

このファイル記述子が使用された後も保持したいと思います。

からファイル記述子をレスキューする方法はありますFILE*か?

切り離す方法はありますか?

FILE*または、ファイル記述子をダミーに置き換える方法はありますか?

PSこれはクロスプラットフォームである必要があり、とにかくPOSIX全体でうまくいきます。

4

4 に答える 4

2

私の問題は、オブジェクトのfcloseクリーンアップに使用すると、FILE*接続されたファイル記述子が閉じられることです。

dup(2)記述子のコピーを取得するために使用できます。その後、close(2)それfclose(3)は何もしません。

まったく同じ fd 番号を維持する必要がある

次に、次dup2の後に再度呼び出しfcloseます。dup2(savedfd, rescuedfd)

于 2014-04-11T09:40:15.313 に答える
2

それfdがあなたのファイル記述子であり、fあなたの FILE* がそこから得たと仮定します。たぶん、次のようなことがうまくいくでしょう:

fd2 = dup(fd);
fclose(f);
dup2(fd2, fd);
close(fd2);
于 2014-04-11T09:55:18.720 に答える
0

これは移植性のないアイデアです (これが良い/最高だと思う場合は投票してください):

GNU libc が提供しfopencookie、BSD は同等のものを提供しますfunopen

これらは実際のFILE*ハンドルを返しますが、実装は独自のものです。

次に、読み取り/書き込み/シーク/クローズ関数を基になるシステム コールにマップするのは比較的簡単です。

read/readfn(cookie, buf, size){ return read((int)cookie, buf, size); }
write/writefn(cookie, buf, size) { return write((int)cookie, buf, size); }
seek/seekfn(cookie, offs, arg) { return seek((int)cookie, offs, arg); } // may require arg mapping to whence
close/closefn(cookie) {} // that's the whole point!
于 2014-04-11T13:56:22.337 に答える