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.`**