#c #curl #libcurl
#c #curl #libcurl
Вопрос:
Этот пример кода содержит:
curl_multi_timeout(multi_handle, amp;curl_timeo);
if(curl_timeo >= 0) {
timeout.tv_sec = curl_timeo / 1000;
if(timeout.tv_sec > 1)
timeout.tv_sec = 1;
else
timeout.tv_usec = (curl_timeo % 1000) * 1000;
}
Почему tv_sec
значение ограничено 1 секундой? Почему значение, возвращаемое curl_multi_timeout()
, не используется как есть (после деления на 1000)?
Предполагая, что для вышеуказанного есть веская причина, тогда есть ли случай, когда вы НЕ стали бы обрезать значение до 1 секунды? О каком случае идет речь?
Ответ №1:
Код просто устанавливает максимальное время ожидания для последующего вызова select()
. Во всяком случае, это похоже на ошибку. Похоже, что код защищает себя от необоснованного ответа от curl_multi_timeout()
. Я предполагаю, что программист подумал: «если функция curl timeout возвращает что-то длиннее одной минуты, тогда не ждите дольше этого» . …а затем продолжил опечатывать одну минуту как одну секунду. Вероятно, это должно выполняться
if (timeout.tv_sec > 60) {
timeout.tv_sec = 60;
else if (timeout.tv_sec == 0) {
timeout.tv_usec = curl_timeo * 1000;
}
Изменение на 1000 не требуется, поскольку curl_multi_timeout()
возвращает миллисекунды, поэтому, если tv_sec
равно нулю, это означает, что возвращаемое значение находится в диапазоне от 0 до 999.
Комментарии:
1. Но tv_usec — это микросекунды. Если curl_timeo равно миллисекундам, то вам действительно нужно умножить на 1000. Это просто мод, который кажется неправильным. Верно?
2. @Paul: Нет, tv_usec — это тоже миллисекунды — вам не нужен дополнительный коэффициент 1000. Если вы использовали микросекунды, вы используете a, у
struct timespec
которого естьtv_nsec
член на микросекунды. Код использует более староеstruct timeval
.3. Нет, tv_usec действительно равен микросекундам: ‘u’ — это префикс SI для micro. Среди других мест: gnu.org/s/hello/manual/libc/Elapsed-Time.html
4. это также означает, что мод верен: 1001 мс = 1 секунда (curl_timeo / 1000) плюс 1000 мс (curl_timeo % 1000 * 1000).
5. @Paul: Вы правы, это микросекунды (1/1 000 000-я доля секунды). Возврат времени ожидания curl составляет 1/1 000 тыс., а затем оно должно быть преобразовано в миллисекунды для
tv_usec
… умножение на 1000 выполняется правильно. Я отредактировал приведенный выше код, чтобы учесть это.