[英]Select (Linux) function always returns 0
在我的情況下,select函數始終返回零,這是超時,並且這是連續發生的,因此我的CPU使用率也高達98%。 我也嘗試設置NULL而不是設置一些超時值,但它仍然返回零。 我還使用了輪詢功能來代替select。 投票也帶來了同樣的問題。
這是我的代碼的一部分;
while(1)
{
value = 0;
selectTimeOut = 0;
memset(buf,0,SIZE);
FD_ZERO(&read_fds);
FD_SET(fd, &read_fds);
struct timeval tv;
tv.tv_sec = 10;
tv.tv_usec = 1000;
fdmax = fd;
//using select to reduce cpu utilization
selectret = select(fdmax + 1,&read_fds,NULL,NULL,&tv);
if (selectret == -1)
{
print_sync("/home/fes/syclogs.txt","Select fails");
exit(0);
}
else
{
print_sync("/home/fes/syclogs.txt","Error set is %s",strerror(errno));
if(!FD_ISSET(fd, &read_fds))
{
print_sync("/home/fes/syclogs.txt","Select Time Out");
selectTimeOut = 1;
}
}
if(selectTimeOut == 1)
continue;
noread = read(fd,buf,SIZE);
}
你的邏輯沒有道理。 errno
僅在select()返回-1時才有意義。 如果返回零,則表明沒有fds准備就緒,因此存在超時,無需測試其他任何東西。 如果返回正值,則需要循環處理許多准備就緒的fd。
為什么不檢查文件結尾或類似情況? 我相信EOF或描述符的其他異常狀態是這種情況的理想選擇。
您可能應該進一步描述描述符和上下文。 fd來自哪里? 它代表什么數據源?
查看調試消息,可能會得出結論,您正在嘗試監視普通文件的更改。 我認為select不能幫助完成此任務。
尾部實用程序源可能會幫助您實現文件監視代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.