【问题标题】:Is there any way to tell that a file descriptor value has been reused?有没有办法告诉文件描述符值已被重用?
【发布时间】:2012-01-26 09:25:56
【问题描述】:

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

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

此问题的一个解决方案是强制调用代码在关闭套接字时通知我的 API,以便我的 API 知道删除关联的状态....但我不希望强制用户这样做,因为这对他们来说很不方便,而且他们很容易忘记这样做。

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

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

【问题讨论】:

    标签: c sockets file-descriptor


    【解决方案1】:

    我不相信。

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

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

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

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

    【讨论】:

    • (嗯,有一个病态的黑客你可以可能不可靠,开始工作 - 覆盖@ 987654323@ 通过动态链接器魔法 - 但真的,不要那样做。我从来没有说过这个。这不是我在暗示这么疯狂的事情。)
    猜你喜欢
    • 2013-08-19
    • 2011-07-15
    • 1970-01-01
    • 2021-08-26
    • 2011-07-28
    • 2014-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多