我正在尝试了解for (i = 0; i < CNT; ++i) {
init(cm, i); // this is setting options in curl easy handles.
}
// I thought this statement will start transfer.
//A-- curl_multi_perform(cm, &still_running);
sleep(5); // put this to check when transfer starts.
do {
int numfds=0;
int res = curl_multi_wait(cm, NULL, 0, MAX_WAIT_MSECS, &numfds);
if(res != CURLM_OK) {
fprintf(stderr, "error: curl_multi_wait() returned %d\n", res);
return EXIT_FAILURE;
}
/*
if(!numfds) {
fprintf(stderr, "error: curl_multi_wait() numfds=%d\n", numfds);
return EXIT_FAILURE;
}
*/
//B-- curl_multi_perform(cm, &still_running);
} while(still_running);
的功能,以便我可以在我的项目中使用它。我在https://gist.github.com/clemensg/4960504找到了示例代码。
以下是我怀疑的代码:
curl_multi_perform
我的理解是,当curl_multi_perform
被调用时,传输开始,但在上面的代码中,标签 A 的sleep()
不会开始传输。我检查了wireshark日志。当控件移过for (i = 0; i < CNT; ++i) {
init(cm, i); // this is setting options in curl easy handles.
curl_multi_perform(cm, &still_running);
sleep(5);
}
语句时,我看到第一个日志输出。
我甚至试过下面的代码:
curl_multi_perform
但是,结果是一样的。当控件处于此循环中时,我没有看到wireshark中的任何日志,但是,一旦我开始在wireshark中看到日志,它们间隔为5秒。
除了这些疑虑之外,我的另一个疑问是:
curl_multi_perform
A&amp;乙?find . -name '*.txt' | parallel 'wc -l {}' 2>/dev/null | paste -sd+ - | bc
吗?
在电话之间?帮助表示感谢。 感谢
答案 0 :(得分:2)
curl_multi_perform以非阻塞的方式运作。它会在没有阻塞的情况下尽可能多地执行,然后返回,期望在需要时再次调用它。因此,第一次调用最有可能开始解析URL中使用的名称,然后第二次或第三次调用可能会启动实际传输或其他内容。它的设计使得应用程序不必关心执行它的确切函数调用号。
然后你一直调用它直到完成所有转移。
我试图在即将出版的(免费和在线)书籍的一章中解释这个概念:Driving with the "multi" interface