Я столкнулся с той же проблемой;как отмечено выше, это ошибка скручивания.Я думал, что выложу здесь ответ, чтобы собрать всю доступную информацию о проблеме.
С отчет об ошибке Red Hat :
libcurlпостроенный без асинхронной библиотеки распознавателя использует alarm () для тайм-аута поиска DNS.Когда происходит тайм-аут, это заставляет libcurl перейти из обработчика сигнала обратно в библиотеку с помощью sigsetjmp, что фактически заставляет libcurl продолжать работу в обработчике сигнала.Это непереносимо и может вызвать проблемы на некоторых платформах.Обсуждение этой проблемы доступно по адресу http://curl.haxx.se/mail/lib-2008-09/0197.html
«Проблемы на некоторых платформах», по-видимому, относятся, по крайней мере, к сбоям в современных системах Linux.Некоторые более глубокие технические подробности приведены по ссылке из цитаты выше:
Существует проблема с тем, как libcurl в настоящее время обрабатывает сигнал SIGALRM.Он устанавливает обработчик для SIGALRM, чтобы принудительно разрешить синхронное разрешение DNS по истечении заданного времени, что является единственным способом прервать такое разрешение в некоторых случаях.Непосредственно перед разрешением DNS он инициализирует указатель longjmp, поэтому, когда сигнал поступает в обработчик сигнала, просто выполняет siglongjmp, управление продолжается из этого сохраненного местоположения, и функция возвращает код ошибки.
Проблема заключается в том, чточто весь следующий поток управления эффективно выполняется внутри обработчика сигнала.Существует не только риск того, что libcurl может вызвать небезопасную функцию асинхронного обработчика (см. Signal (7)) в течение этого времени, но также может вызвать функцию обратного вызова пользователя, которая может вызывать абсолютно все.На самом деле, siglongjmp () сам по себе отсутствует в списке асинхронно-безопасных функций POSIX, и это все вызовы обработчика сигналов libcurl!
Существует несколько способов решения этой проблемы, в зависимости от того,вы создали libcurl или если вы застряли с тем, который был предоставлен вашим дистрибутивом или системным администратором:
Если вы не можете перестроить libcurl, то вы можете вызвать curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1)
на всехскручиваемость ручки, которые вы используете.Документация для CURLOPT_NOSIGNAL
Примечания:
Пройдите длинный.Если это значение равно 1, libcurl не будет использовать какие-либо функции, которые устанавливают обработчики сигналов, или любые функции, которые вызывают отправку сигналов процессу.Эта опция в основном здесь, чтобы позволить многопоточным приложениям Unix по-прежнему устанавливать / использовать все параметры тайм-аута и т. Д., Не рискуя получить сигналы.(Добавлено в 7.10)
Если установлен этот параметр и библиотека libcurl была создана со стандартным преобразователем имен, тайм-ауты не возникнут, пока происходит разрешение имени .Подумайте о создании libcurl с поддержкой c-ares для включения асинхронного поиска DNS, который обеспечивает хорошие тайм-ауты для разрешения имен без сигналов.
Тайм-ауты DNS желательно иметь в большинстве случаев, так что это неидеальное решениеЕсли у вас есть возможность перестроить libcurl в вашей системе, то вы можете ...
Существует библиотека асинхронного распознавателя DNS, которая называется c-ares , и это curlспособен использовать для разрешения имен.Использование этой библиотеки является предпочтительным решением проблемы (и я полагаю, что большинство сборщиков Linux уже поняли это).Чтобы включить поддержку c-ares, сначала соберите и установите библиотеку, затем перед сборкой передайте флаг --enable-ares
сценарию curl configure
. Полные инструкции здесь .