一、select/poll/epoll
int select(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset,struct timeval *timeout);
timeout為等待的指定時間,當有描述符符合條件 或是 超過超時時間的話,函數返回,可以利用timeout完成超時的判斷
int poll ( struct pollfd * fds, unsigned int nfds, int timeout);
timeout為等待的指定時間,當有描述符符合條件 或是 超過超時時間的話,函數返回,可以利用timeout完成超時的判斷
int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);
timeout為等待的指定時間,當有描述符符合條件 或是 超過超時時間的話,函數返回,可以利用timeout完成超時的判斷
示例 使用epoll時的nginx
timer為最早一個超時的事件的超時值,或為一個默認值
二、libcurl庫提供的超時配置
curl_easy_setopt(xxx, CURLOPT_CONNECTTIMEOUT_MS, yyy
);嘗試連接等待的時間,以毫秒為單位。如果設置為0,則無限等待。
curl_easy_setopt(xxx, CURLOPT_TIMEOUT_MS,yyy
); 設置cURL允許執行的最長毫秒數
三、alarm/setitimer
通過指定間隔時間發出SIGALRM信號,在檢查是否有時間超時
示例:
nginx定時器
nginx提供了利用settimer每隔一段時間 喚起epoll_wait,在檢查是否有時間超時的方式,避免了頻繁調用gettimeofday的系統函數
四、利用recv/send提供的超時參數配置
setsockopt 可以對socket句柄設置各種參數,其中包括了SO_SNDTIMEO, SO_RCVTIMEO兩個選擇,他們可以控制使用recv, send時候的超時時間,但該參數不是對所有的系統都生效的