簡體   English   中英

選擇(Linux)函數始終返回0

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM