gpt4 book ai didi

c++ - getaddrinfo在程序中调用assert

转载 作者:行者123 更新时间:2023-12-02 02:55:18 25 4
gpt4 key购买 nike

我正在使用 libcurl 开发一个程序。该程序创建一个线程,该线程又使用 libcurl 发出 HTTP 请求。但有时程序会因错误而崩溃

unexpected error 9 on netlink descriptor

在curl中关闭AsynchDNS之后。但问题仍然存在。据我了解,断言的原因是 getaddrinfo。也许要在多线程应用程序中使用 getaddrinfo 需要某种初始化?或者 getaddrinfo 通常是非线程安全的?

GDB stack trace

libcurl 版本:

curl 7.67.0 (x86_64-pc-linux-gnu) libcurl/7.67.0 OpenSSL/1.1.0g zlib/1.2.11 libidn2/2.0.4 Release-Date: 2019-11-06 Protocols: dict file ftp ftps gopher http https imap imaps pop3 pop3s rtsp smb smbs smtp smtps telnet tftp Features: HTTPS-proxy IDN IPv6 Largefile libz NTLM NTLM_WB SSL TLS-SRP UnixSockets

glibc 版本:

ldd (Ubuntu GLIBC 2.27-3ubuntu1) 2.27 Copyright (C) 2018 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Written by Roland McGrath and Ulrich Drepper.

最佳答案

这是应用程序中的文件描述符竞争。错误 9 (EBADF) 的典型情况如下所示:

  1. 线程 A 关闭文件描述符。
  2. 线程 B 调用 getaddrinfo 并打开 Netlink 套接字。它恰好接收到相同的描述符值。
  3. 由于错误,线程 A 再次关闭相同的文件描述符。通常情况下,这是良性的,但由于并发执行,glibc 创建的 Netlink 套接字被关闭。
  4. 线程 B 尝试使用 Netlink 套接字描述符并收到 EBADF 错误。

修复此类错误的关键是弄清楚双重关闭到底发生在哪里。

关于c++ - getaddrinfo在程序中调用assert,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58827641/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com