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