有没有办法告诉文件描述符值已被重用?

时间:2011-12-22 19:42:54

标签: c sockets file-descriptor

我有一个以文件描述符作为参数调用的API,它在内部存储与文件描述符关联的一些状态。然后在具有相同文件描述符值的后续调用中,可以查阅先前生成的状态。

除了调用代码用文件描述符调用我的API,然后关闭文件描述符,然后分配一个新的文件描述符(通过socket()或accept()等),这大部分都有效。具有与现在关闭的整数值相同的整数值,然后将该新文件描述符传递给我的API。那时,我的API做错了,因为它错误地将旧套接字的状态与新文件描述符相关联。

这个问题的一个解决方案是强制调用代码在关闭套接字时通知我的API,以便我的API知道删除关联状态....但我不想强制用户要做到这一点,因为这对他们来说不方便,他们也不会忘记这样做。

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

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

1 个答案:

答案 0 :(得分:2)

我不相信。

最好提供打开/关闭包装器,将不透明类型返回给调用者。 (如果需要,您还可以提供一个函数来从该opaque类型中获取基础文件描述符。)

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

根据您的库提供的确切内容,可能有更好的替代方案,但我认为这通常是针对C API的。

旁注:如果您希望您的库和用户代码都在这些套接字上发出读写操作......请注意,这真的很棘手。