curl学习(一):段错误

c语言使用curl时出现段错误

  • 问题发现
    在使用c语言编程时,按照一般流程使用curl进行http数据的获取,没有错误,但是当开启线程调用该函数频繁时,会出现段错误,并且复现起来较为困难,经后期排查,发现问题出现在了curl上面,处理完该bug后,稍加整理,作为以后提醒

  • 原因

  • 原来libcurl在configure默认配置编译的情况下,它是使用alarm+siglongjmp实现域名解析超时。当多个线程都使用超时处理的时候,同时主线程中有sleep或是wait等操作。libcurl将会发信号打断这个wait从而导致程序退出

  • 解决方法

  • *在设置curl属性时添加一条
  • curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1L);
  • 这样域名解析就没了超时机制*

  • 官网说明
    **`CURLOPT_NOSIGNAL

Pass a long. If it is 1, libcurl will not use any functions that install
signal handlers or any functions that cause signals to be sent to
unix applications to still set/use all timeout options etc, without
risking getting signals. (Added in 7.10)

If this option is set and libcurl has been built with the standard
name resolver, timeouts will not occur while the name resolve
takes place. Consider building libcurl with c-ares support to enable
asynchronous DNS lookups, which enables nice timeouts for name
resolves without signals.

Setting CURLOPT_NOSIGNAL to 1 makes libcurl NOT ask the
system to ignore SIGPIPE signals, which otherwise are sent by the
system when trying to send data to a socket which is closed in the
other end. libcurl makes an effort to never cause such SIGPIPEs to
trigger, but some operating systems have no way to avoid them
and even on those that have there are some corner cases when
they may still happen, contrary to our desire. In addition, using
CURLAUTH_NTLM_WB authentication could cause a SIGCHLD
signal to be raised.`**

参考链接
http://www.xuebuyuan.com/126531.html

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值