我有一个用文件描述符作为参数调用的API,它在内部存储与文件描述符相关的一些状态。然后,在使用相同的文件描述符值的后续调用时,可以参考先前生成的状态。
这大部分是有效的,除了调用代码用文件描述符调用我的API,然后关闭文件描述符,然后分配一个新的文件描述符(通过socket()或accept()或等),最终具有与现在关闭的相同的整数值,然后将新的文件描述符传递给我的API。此时,我的API做了错误的事情,因为它错误地将旧套接字的状态与新的文件描述符相关联。
此问题的一个解决方案是强制调用代码在关闭套接字时通知我的API,以便我的API知道删除相关状态....但我不希望强迫用户这样做,因为这会给他们带来不便,而且他们很容易忘记这样做。
因此,我想知道是否有任何聪明的方法来判断时间T的文件描述符是否仍然与它在时间(T-x)时关联的相同底层结构相关联。如果我能做到这一点,我的API将足够聪明,当一个文件描述符整数值被重用,并做正确的事情。
这段代码主要是为了在MacOS/X和Linux下运行,但是解决方案越便携越好。
我不这么认为。
最好为open/close提供包装器,将不透明类型返回给调用者。(如果需要,您还可以提供一个函数来从该不透明类型中获取底层文件描述符。)
如果你不想包装打开/关闭,你仍然可以为你的api使用一个不透明的结构(只需要创建一对函数(带文件描述符参数)并释放该结构),但实际上,你的用户将不得不记住释放或应用程序将泄漏。(但是C开发人员应该知道如何做到这一点- malloc
/free
已经存在一段时间了。)
根据您的库提供的确切内容,可能有更好的替代方案,但我认为这是C api通常所做的。
旁注:如果你希望你的库和用户代码在这些套接字上发出读取和写入…