2011-05-02 34 views
1

This示例代码包含:为什么要改变curl_multi_timeout()的返回值?

curl_multi_timeout(multi_handle, &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超时函数返回超过一分钟的内容,那么不要再等了。” ...然后进行一分钟错字一秒钟。它可能应该做

if (timeout.tv_sec > 60) { 
    timeout.tv_sec = 60; 
else if (timeout.tv_sec == 0) { 
    timeout.tv_usec = curl_timeo * 1000; 
} 

由1000 MOD是因为curl_multi_timeout()回报毫秒不必要的,所以如果tv_sec是零,这意味着,返回值的范围为0 - 999

+0

但tv_usec是微秒。如果curl_timeo是毫秒,那么你需要乘以1000.这只是看起来不对的mod。对? – 2011-05-02 14:42:44

+0

@Paul:不,tv_usec也是毫秒 - 你不需要额外的因子1000.如果你使用的是微秒,你可以使用struct timespec,它有一个微秒的tv_nsec成员。该代码使用较旧的'struct timeval'。 – unpythonic 2011-05-02 15:01:58

+0

不,tv_usec确实是微秒:'u'是micro的SI前缀。其他地方:http://www.gnu.org/s/hello/manual/libc/Elapsed-Time.html – 2011-05-02 15:09:03