有没有办法判断文件描述符值是否被重用?

3
我有一个API,它接受文件描述符作为参数,并在内部存储与文件描述符关联的某些状态。然后,在使用相同的文件描述符值进行后续调用时,可以查询先前生成的状态。
这基本上是有效的,但存在一种情况,即调用代码使用文件描述符调用我的API,然后关闭该文件描述符,接着分配一个新的文件描述符(通过socket()、accept()等),其整数值与现在关闭的文件描述符相同,然后将该新的文件描述符传递给我的API。此时,我的API执行错误操作,因为它错误地将旧套接字的状态与新的文件描述符相关联。
解决此问题的一种方法是强制调用代码在关闭套接字时通知我的API,以便我的API知道删除关联的状态...但我不想强迫用户这样做,因为这对他们来说很不方便,而且他们很可能会忘记这样做。
因此,我想知道是否有任何巧妙的方法可以告诉我们,在时间T时文件描述符仍与与之关联的结构相同,如同在时间(T-x)。如果我能做到这一点,我的API将足够智能,可以判断文件描述符整数值是否已被重复使用,并采取正确的行动。
FWIW,该代码旨在主要运行在MacOS/X和Linux下,但解决方案越通用,越好。
1个回答

2

我不这么认为。

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

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

根据您的库提供的具体内容,可能有更好的选择,但这是我认为通常用于C API的方法。

旁注:如果您希望您的库和用户代码都在这些套接字上发出读取和写入请求...请小心,这很棘手。


嗯,其实有一种病态的黑科技,你_可能_可以通过动态链接器的巫术来覆盖close函数,但是真的,请不要这样做。我从未说过这个。这不是我在建议这么疯狂的事情。 - Mat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接