我正在使用 libcurl 开发一个程序。该程序创建一个线程,该线程又使用 libcurl 发出 HTTP 请求。但有时程序会因错误而崩溃
netlink 描述符上出现意外错误 9
在curl中关闭AsynchDNS之后。但问题依然存在。据我了解断言的原因是getaddrinfo
。也许要用getaddrinfo
在多线程应用程序中需要某种初始化吗?或者是getaddrinfo
一般是非线程安全的?
libcurl 版本:
卷曲 7.67.0 (x86_64-pc-linux-gnu) libcurl/7.67.0 OpenSSL/1.1.0g zlib/1.2.11 libidn2/2.0.4
发布日期:2019-11-06
协议: dict file ftp ftps gopher http https imap imaps pop3 pop3s rtsp smb smbs smtp smtps telnet tftp
功能: HTTPS 代理 IDN IPv6 大文件 libz NTLM NTLM_WB SSL TLS-SRP UnixSockets
glibc版本:
ldd(Ubuntu GLIBC 2.27-3ubuntu1)2.27
版权所有 (C) 2018 自由软件基金会, Inc.
这是免费软件;请参阅复制条件的来源。没有
保修单;甚至不是为了适销性或特定用途的适用性。
由罗兰·麦克格拉斯和乌尔里希·德雷珀撰写。
这是应用程序中的文件描述符竞争。错误 9 的典型情况(EBADF
)看起来像这样:
- 线程 A 关闭文件描述符。
- 线程B调用
getaddrinfo
并打开一个 Netlink 套接字。它恰好接收到相同的描述符值。
- 由于错误,线程 A 再次关闭相同的文件描述符。通常,这是良性的,但由于并发执行,glibc 创建的 Netlink 套接字被关闭。
- 线程 B 尝试使用 Netlink 套接字描述符并接收
EBADF
error.
修复此类错误的关键是弄清楚双重关闭到底发生在哪里。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)