摘要:if(SELECT(sockfd+1,&rdfds,NULL,NULL,&tv)==0){超時處理}……三、設置定時器這種方法的原理是在從套接字接收數據之前先設置8秒鐘的定時器。如果8秒鐘內沒有數據到來,內核產生的SIGALRM信號會中斷當前的讀操作。我們知道設置信號捕捉函數可以用signal函數或是sigaction函數。但這里只能使用sig
if (SELECT(sockfd+1, &rdfds, NULL, NULL, &tv) == 0)
{
超時處理
}
……
三、 設置定時器
這種方法的原理是在從套接字接收數據之前先設置8秒鐘的定時器。如果8秒鐘內沒有數據到來,內核產生的SIGALRM信號會中斷當前的讀操作。我們知道設置信號捕捉函數可以用signal函數或是sigaction函數。但這里只能使用sigaction函數,因為signal設置的信號處理函數執行完后會重新執行被中斷的操作。參考代碼如下:
void handler(int signo) // 自定義SIGALRM信號處理函數
{
return;
}
struct sigaction act; // 描述信號行為的變量
……
sigaction(SIGALRM, NULL, &act); // 獲取SIGALRM信號的屬性
act.sa_handler = handler; // 設置SIGALRM信號的處理函數
act.sa_flags &= ~SA_RESTART; // 關閉重啟被中斷操作的選項
sigaction(SIGALRM, &act, NULL); // 設置SIGALRM信號的屬性
alarm(8); // 設置8秒鐘的定時器
……
雖然我們是以套接字的讀操作為例,實際上在很多類似的情況中,大家都可以酌情采取上面介紹的方法。巧妙的運用所學知識會讓你的程序更加靈活和人性化。
[1] [2]
通信工程師備考資料免費領取
去領取
專注在線職業教育25年