Return to curl_multi_wait.3 CVS log | Up to [ELWIX - Embedded LightWeight unIX -] / embedaddon / curl / docs / libcurl |
1.1 ! misho 1: .\" ************************************************************************** ! 2: .\" * _ _ ____ _ ! 3: .\" * Project ___| | | | _ \| | ! 4: .\" * / __| | | | |_) | | ! 5: .\" * | (__| |_| | _ <| |___ ! 6: .\" * \___|\___/|_| \_\_____| ! 7: .\" * ! 8: .\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al. ! 9: .\" * ! 10: .\" * This software is licensed as described in the file COPYING, which ! 11: .\" * you should have received as part of this distribution. The terms ! 12: .\" * are also available at https://curl.haxx.se/docs/copyright.html. ! 13: .\" * ! 14: .\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell ! 15: .\" * copies of the Software, and permit persons to whom the Software is ! 16: .\" * furnished to do so, under the terms of the COPYING file. ! 17: .\" * ! 18: .\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY ! 19: .\" * KIND, either express or implied. ! 20: .\" * ! 21: .\" ************************************************************************** ! 22: .TH curl_multi_wait 3 "November 28, 2019" "libcurl 7.70.0" "libcurl Manual" ! 23: ! 24: .SH NAME ! 25: curl_multi_wait - polls on all easy handles in a multi handle ! 26: .SH SYNOPSIS ! 27: .nf ! 28: #include <curl/curl.h> ! 29: ! 30: CURLMcode curl_multi_wait(CURLM *multi_handle, ! 31: struct curl_waitfd extra_fds[], ! 32: unsigned int extra_nfds, ! 33: int timeout_ms, ! 34: int *numfds); ! 35: .ad ! 36: .SH DESCRIPTION ! 37: \fIcurl_multi_wait(3)\fP polls all file descriptors used by the curl easy ! 38: handles contained in the given multi handle set. It will block until activity ! 39: is detected on at least one of the handles or \fItimeout_ms\fP has passed. ! 40: Alternatively, if the multi handle has a pending internal timeout that has a ! 41: shorter expiry time than \fItimeout_ms\fP, that shorter time will be used ! 42: instead to make sure timeout accuracy is reasonably kept. ! 43: ! 44: The calling application may pass additional curl_waitfd structures which are ! 45: similar to \fIpoll(2)\fP's pollfd structure to be waited on in the same call. ! 46: ! 47: On completion, if \fInumfds\fP is non-NULL, it will be populated with the ! 48: total number of file descriptors on which interesting events occurred. This ! 49: number can include both libcurl internal descriptors as well as descriptors ! 50: provided in \fIextra_fds\fP. ! 51: ! 52: If no extra file descriptors are provided and libcurl has no file descriptor ! 53: to offer to wait for, this function will return immediately. (Try ! 54: \fIcurl_multi_poll(3)\fP instead if you rather avoid this behavior.) ! 55: ! 56: This function is encouraged to be used instead of select(3) when using the ! 57: multi interface to allow applications to easier circumvent the common problem ! 58: with 1024 maximum file descriptors. ! 59: .SH curl_waitfd ! 60: .nf ! 61: struct curl_waitfd { ! 62: curl_socket_t fd; ! 63: short events; ! 64: short revents; ! 65: }; ! 66: .fi ! 67: .IP CURL_WAIT_POLLIN ! 68: Bit flag to curl_waitfd.events indicating the socket should poll on read ! 69: events such as new data received. ! 70: .IP CURL_WAIT_POLLPRI ! 71: Bit flag to curl_waitfd.events indicating the socket should poll on high ! 72: priority read events such as out of band data. ! 73: .IP CURL_WAIT_POLLOUT ! 74: Bit flag to curl_waitfd.events indicating the socket should poll on write ! 75: events such as the socket being clear to write without blocking. ! 76: .SH EXAMPLE ! 77: .nf ! 78: CURL *easy_handle; ! 79: CURLM *multi_handle; ! 80: ! 81: /* add the individual easy handle */ ! 82: curl_multi_add_handle(multi_handle, easy_handle); ! 83: ! 84: do { ! 85: CURLMcode mc; ! 86: int numfds; ! 87: ! 88: mc = curl_multi_perform(multi_handle, &still_running); ! 89: ! 90: if(mc == CURLM_OK ) { ! 91: /* wait for activity, timeout or "nothing" */ ! 92: mc = curl_multi_wait(multi_handle, NULL, 0, 1000, &numfds); ! 93: } ! 94: ! 95: if(mc != CURLM_OK) { ! 96: fprintf(stderr, "curl_multi failed, code %d.\\n", mc); ! 97: break; ! 98: } ! 99: ! 100: /* 'numfds' being zero means either a timeout or no file descriptors to ! 101: wait for. Try timeout on first occurrence, then assume no file ! 102: descriptors and no file descriptors to wait for means wait for 100 ! 103: milliseconds. */ ! 104: ! 105: if(!numfds) { ! 106: repeats++; /* count number of repeated zero numfds */ ! 107: if(repeats > 1) { ! 108: WAITMS(100); /* sleep 100 milliseconds */ ! 109: } ! 110: } ! 111: else ! 112: repeats = 0; ! 113: ! 114: } while(still_running); ! 115: ! 116: curl_multi_remove_handle(multi_handle, easy_handle); ! 117: .fi ! 118: .SH RETURN VALUE ! 119: CURLMcode type, general libcurl multi interface error code. See ! 120: \fIlibcurl-errors(3)\fP ! 121: .SH AVAILABILITY ! 122: This function was added in libcurl 7.28.0. ! 123: .SH "SEE ALSO" ! 124: .BR curl_multi_fdset "(3), " curl_multi_perform "(3)", curl_multi_poll "(3) ",