在使用pthread_cancel()
的多线程案例中使用open时,我有一些问题。在线程中我需要打开一些文件来阅读。
所以我的第一个问题是,我是否需要将我使用这些打开的文件描述符的字段括在pthread_cleanup_push()
和pthread_cleanup_pop()
中。我认为如果线程被取消,文件仍然打开,那就不太好了。
但是,据我所知,open()
函数本身是一个可能的取消点。如果在那里发生取消(或者我在哪里可以得到相关信息,我不知道文件描述符是否被打开?)
最后,是否有一个Unix接口来判断文件描述符是否已打开?
答案 0 :(得分:2)
答案 1 :(得分:1)
是的,如果某个帖子在保留对打开文件描述符的唯一引用时可以取消,则需要使用pthread_cleanup_push
/ pop
来确保它们已关闭;否则他们会泄漏。
实际上,open
函数本身是一个取消点,其他几个资源分配函数(这里是a complete list of cancellation points)也是如此。标准中有一种语言,如果在open
发生取消,可以读取要求文件而不是,但我不相信实现已经正确。处理此问题的唯一100%可靠方法是使用pthread_setcancelstate
在打开文件(或分配其他资源)时禁用取消,并仅在后续pthread_cleanup_push
之后重新启用它。
您可以通过查看no-op fcntl
是否因errno设置为EBADF
而失败来判断文件描述符是否已打开,但请勿执行此操作。它本质上是完整的 - 在检查和代码控制之间 - 依赖于检查,另一个线程可能会重复使用该文件描述符号,并且您的程序会出现异常,可能是灾难性的(例如,覆盖错误的文件)。