2011-12-22 42 views
3

我有一个用文件描述符作为参数调用的API,它在内部存储一些与文件描述符关联的状态。然后在具有相同文件描述符值的后续调用中,可以查询先前生成的状态。有什么办法可以告诉文件描述符的值已被重用?

除了调用代码用文件描述符调用我的API,然后关闭文件描述符,然后分配一个新的文件描述符(通过socket()或accept()等)的情况下,与现在关闭的整数值相同,然后将新的文件描述符传递给我的API。此时,我的API做错了事,因为它错误地将旧套接字的状态与新的文件描述符关联起来。

解决此问题的一种方法是强制调用代码在关闭套接字时通知我的API,以便我的API知道删除相关状态....但我不想强制用户要这么做,因为这对他们来说会很不方便,而且他们总会忘记去做。

因此,我想知道是否有任何聪明的方法来判断时间T下的文件描述符是否仍然与它在时间(T-x)处关联的相同底层结构相关联。如果我能做到这一点,那么我的API将足够聪明,可以告诉文件描述符的整数值何时被重用并做正确的事情。

FWIW此代码旨在运行在MacOS/X和Linux下,但更便携的解决方案越好。

回答

2

我不这么认为。

你最好提供打开/关闭的包装,将不透明类型返回给调用者。 (如果需要,你也可以提供一个函数来获取底层文件描述符)

如果你不想打开/关闭,你仍然可以为你的API使用一个不透明的结构(只是创建一对函数来创建(使用文件描述符参数)并释放该结构),但实际上,您的用户必须记住要释放或应用程序将泄漏。 (但C语言开发都应该知道怎么做 - malloc/free已经有一段时间了)

根据您的库提供什么,有可能是更好的选择,但是这是什么,我相信一般为C API完成。注意:如果你期望你的库和用户代码在这些套接字上发行读写操作,请注意,这真的很棘手。

+0

嘘,时间重构。 :^) – 2011-12-22 21:29:26

+0

(好吧,有一个病态的黑客,你可以_,可能_,不可靠,开始工作 - 通过动态链接程序魔法重写'close' - 但是真的,不要这样做,我从来没有这样说过。暗示了这样一个疯狂的事情。) – Mat 2011-12-22 21:33:10

相关问题