2011-12-22 7 views
3

私は、引数としてファイルディスクリプタと呼ばれているAPIを持っている、そしてそれは、内部のファイル記述子に関連付けられているいくつかの状態を保存します。その後、同じファイル記述子値を持つ後続の呼び出しで、前に生成された状態を調べることができます。ファイルディスクリプタ値が再利用されたことを伝えるための方法はありますか?

これは主に、呼び出し元コードがファイル記述子を使用してAPIを呼び出し、ファイル記述子を閉じてから終了するsocket()またはaccept()などを介して新しいファイル記述子を割り当てます新しいファイルディスクリプタをAPIに渡します。その時点で、私のAPIは誤って古いソケットの状態を新しいファイル記述子に関連付けるので、間違ったことをします。私のAPIが関連付けられた状態を削除するには、知っているように、この問題へ

一つの解決策は、それがソケットを閉じたときに、私のAPIを通知するために、呼び出し元のコードを強制することです....が、私は強制的に希望されませんユーザーには不便なので、やり直すことを忘れる傾向があります。

したがって、時刻Tのファイル記述子が時刻(T-x)に関連付けられていた同じ基礎構造に依然として関連付けられているかどうかを知る巧妙な方法があるかどうかは疑問です。私がそれを行うことができれば、私のAPIは、ファイル記述子の整数値がいつ再利用されたかを知り、適切なことをするのに十分なほどスマートになります。

FWIWこのコードは、MacOS/XとLinuxで主に動作するようになっていますが、より移植性の高いソリューションであればあるほど優れています。

答えて

2

私はそう信じていません。

オープン/クローズ用のラッパーを用意して、呼び出し側に不透明な型を戻す方がよい場合があります。

open/closeをラップしたくない場合でも、あなたのAPIには依然として不透明な構造体を使用できます(ちょうどそのオブジェクトの不透明な構造体を使用することができます(ファイルディスクリプタパラメータで)作成してその構造を解放する機能のペアを作成しますが、実際には、ユーザーはリリースすることを忘れないでください。 (ただし、Cの開発者がそれを行う方法を知っていることになっている - 。malloc/freeしばらくの間、回避されている)

あなたのライブラリーが提供する正確内容に応じて、そこより良い選択肢は、おそらくですが、これは、私は一般的であると考えているものですC APIのために行われます。

サイドノート:ライブラリーとユーザーコードの両方がこれらのソケットで読み取りと書き込みを実行すると思われる場合は注意してください。それは本当に難しいことです。

+0

ブー、リファクタリングまでの時間。 :^) –

+0

(まあ、あなたが_could_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _そんなクレイジーなことを示唆している) – Mat

関連する問題