您的位置:首页 > 编程语言 > C语言/C++

curl学习(一):段错误

2016-06-13 18:33 477 查看

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  bug c语言 curl 段错误