关于curl无故crash的问题解决

ps:小白一枚,都是从网上找的解决方案,简单记录一下

libcurl多线程无故crash 可能会影响的原因:

1.当多个线程都使用超时处理的时候,同时主线程中有sleep或是wait等操作。
 如果不设置这个选项,libcurl将会发信号打断这个wait从而导致程序退出。所以需要:
    curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);

2.关于libcurl库的初始化和关闭:curl_global_init()和curl_global_cleanup()
这两个函数并不是线程安全的。所以只能在主线程中进行一次的初始化和清除。

3.尝试给线程函数上锁,锁上以后运行两天出现了一次崩溃

4.给回调函数上锁
回调实例:    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, OnWriteData); //对返回的数据进行操作的函数地址
给OnWriteData 没啥用这各操作

5.openssl需要上锁 参考:https://blog.csdn.net/weiyuefei/article/details/51426000?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522170132236616800197029623%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=170132236616800197029623&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-51426000-null-null.142^v96^pc_search_result_base2&utm_term=libcurl%E5%B4%A9%E6%BA%83&spm=1018.2226.3001.4187

6.openssl版本问题: openssl 1.0.2 不是线程安全的,当前我们程序用的是1.0.1

以上是针对此次问题做出的可能存在的问题以及解决办法,最后排查发现主要是问题2导致的,代码里有写curl_global_init,并且是在构造函数,但是我没有定位清除,因为还有个构造函数的重载,最后调的是另一个构造函数,所以导致每一个easu_init都调用global_init,导致的crash

针对方案3和4 用的下面代码:

std::mutex g_mutex;
std::lock_guard<std::mutex> lock(g_mutex); // 在回调函数中加锁

基本就是这样

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~分割线~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

上次这样做了还是有问题,现在针对openssl库加锁,是每次post请求都自己带锁和解锁,参考是的官方给的文档

//创建多线程
bool startThread()
{
    openssl_crypto_init_locks();
     // 要多线程调用前先设置openssl的lock回调
    CRYPTO_set_locking_callback(openssl_crypto_locking_callback);
    bool ret = true;
    if(!m_isRunning)
    {
        m_isRunning = true;
        m_thread = new std::thread(threadFun, this);
    }
    return ret;
}

//锁的初始化
void openssl_crypto_init_locks()
{
    for(int i = 0; i < CRYPTO_num_locks(); ++i)
    {
        openssl_lock_list = std::vector<std::mutex>(CRYPTO_num_locks());
    }
}
//锁的回调
void openssl_crypto_locking_callback(int mode, int type, const char * const, int line)
{
    if (mode & CRYPTO_LOCK)
    {
        openssl_lock_list[type].lock();       
    }
    else 
    {
        openssl_lock_list[type].unlock();
    }
}

  • 7
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
如果在使用命令行时遇到 "curl: command not found" 错误,这意味着你的系统上没有安装或者没有正确配置 curl 命令。Curl 是一个用于发送 HTTP 请求和接收 HTTP 响应的命令行工具。 要解决这个问题,你可以尝试以下几个步骤: 1. 确认 curl 是否已经安装:在终端或命令行中运行 `curl --version` 或者 `curl -V` 命令,查看是否输出 curl 的版本信息。如果没有输出或者提示命令不存在,那么 curl 可能没有安装。 2. 安装 curl:根据你所使用的操作系统,使用相应的包管理器来安装 curl。比如在 Ubuntu 上可以运行 `sudo apt-get install curl`,在 CentOS 上可以运行 `sudo yum install curl`。 3. 添加 curl 到环境变量:如果 curl 已经安装但仍然无法找到命令,可能是因为没有将 curl 的路径添加到系统的环境变量中。你可以编辑你的 shell 配置文件(比如 ~/.bashrc 或者 ~/.bash_profile),在其中添加类似于 `export PATH=$PATH:/path/to/curl` 的语句,并保存文件。然后重新启动终端或者运行 `source ~/.bashrc`(或者 `source ~/.bash_profile`)使之生效。 4. 检查系统路径配置:在某些情况下,系统路径配置可能出现问题导致无法找到 curl 命令。你可以尝试使用绝对路径来执行 curl,比如 `/usr/bin/curl`。如果这样可以正常执行,那么可能需要检查系统路径配置是否正确。 如果你仍然遇到问题,可以提供更多详细的信息,比如操作系统和版本,以便我能够给出更具体的帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小八嘎

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值