Моя текущая настройка завивки, чтобы вызвать веб-страницу, сохранить ее в строке и повторить процесс после сна в течение секунды. Это код для записи в строку:Curl вызывает ошибку openssl
#include <curl/curl.h>
#include <string>
#include <iostream>
#include <thread>
#include <chrono>
size_t curl_writefunc(void* ptr, size_t size, size_t nmemb, std::string* data)
{
data->append((const char*)ptr, size * nmemb);
return size * nmemb;
}
void curl_handler(std::string& data)
{
int http_code = 0;
CURL* curl;
// Initialize cURL
curl = curl_easy_init();
// Set the function to call when there is new data
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, curl_writefunc);
// Set the parameter to append the new data to
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &data);
// Set the URL to download; just for this question.
curl_easy_setopt(curl, CURLOPT_URL, "http://www.example.com/");
// Download
curl_easy_perform(curl);
// Get the HTTP response code
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &http_code);
// Clean up
curl_easy_cleanup(curl);
curl_global_cleanup();
}
int main()
{
bool something = true;
std::string data;
while (something)
{
curl_handler(data);
std::cout << data << '\n';
data.clear();
std:: this_thread:: sleep_for (std:: chrono:: seconds(1));
}
}
Однако он работает в проблему около 20 минут в режиме исполнения, и это сообщение, которое она противостоит мне:
140377776379824:error:02001018:system library:fopen:Too many open files:bss_file.c:173:fopen('/etc/ssl/openssl.cnf','rb')
140377776379824:error:2006D002:BIO routines:BIO_new_file:system lib:bss_file.c:178:
140377776379824:error:0E078002:configuration file routines:DEF_LOAD:system lib:conf_def.c:199:
кажется, проистекают из файл openssl, который не закрывается, как только он заполнил свою задачу в единственной итерации. Если итерация повторяется несколько раз, открытые файлы складываются и в какой-то момент связаны с ошибкой. Я все еще очень начинающий программист, и поэтому не хочу начинать возиться с openSSL, поэтому я пришел сюда, чтобы спросить: может быть, есть решение для такого рода проблем. Может ли это быть разрешено путем объявления объекта curl за пределами отозванной функции?
Что делать, если вы не вызываете 'curl_global_cleanup()' внутри 'curl_handler()', но вызываете его только один раз ближе к концу 'main()' вместо? – timrau
@timrau, спасибо за подсказку, он начал толкать меня в правильном направлении. Проблема в том, что некоторые файлы могут оставаться открытыми, даже после очистки, это может вызвать проблемы с параллелизмом, но, скорее, избыток ресурсов. – TheCharlatan