2012-08-27 44 views
0

我碰到一個比較奇怪的問題:段錯誤的FD_ISSET

我用select(),以確定是否套接字變得可讀。但是,每當客戶端連接時,我會調用FD_ISSET()來檢查給定套接字是否存在於fd_set中,我會遇到段錯誤。

/* [...] */ 

while(/* condition */){ 

    timeout.tv_sec = 0; 
    timeout.tv_usec = SELECT_TIMEOUT; 

    //this simply fills sockets with some file descriptors (passed in by clients - both parameters are passed by reference) 
    maxfd = this->build_fd_set(clients, sockets); 

    //wait until something relevant happens 
    readableCount = select(maxfd + 1, &sockets, (fd_set*)NULL, (fd_set*)NULL, &timeout); 

    if(readableCount > 0){ 
     //Some sockets have become readable 

     printf("\nreadable: %d, sockfd: %d, maxfd: %d\n", 
       readableCount, this->sockfd, maxfd); 

     //Check if listening socket has pending connections 
     // SEGFAULT OCCURS HERE 
     if(FD_ISSET(this->sockfd, &sockets)) { 

      DBG printf("new connection incoming"); 

      this->handle_new_connection(clients); 

      /* [...] */ 
     }else { 
      // Data is pending on some socket 
      /* [...] */ 
     } 
    }else if(readableCount < 0) { 
     //An error occured 
     /* [...] */ 
     return; 
    }else { 
     // select has timed out 
     /* [...] */ 
    } 

} 

編輯: 呀,比較遺憾的是稀疏的信息:我已經更新了代碼。

this->sock_fd被設置爲監聽套接字的描述符,使用this->sockfd = socket(AF_UNIX, SOCK_STREAM, 0);創建,然後通過listen(this->sockfd, ACCEPT_BACKLOG)進行監聽。

build_fd_set:

int SvcServer::build_fd_set(const vector<int>& clients, fd_set& sockets) { 

    //build up the socket set 
    FD_ZERO(&sockets); 
    FD_SET(this->sockfd, &sockets); //listening socket is always part of the set 

    int maxfd = this->sockfd; 
    //Add all currently connected sockets to the list 
    for(vector<int>::const_iterator it = clients.begin() ; it != clients.end() ; ++it)  { 
     FD_SET(*it, &sockets); 
     maxfd = max(maxfd, *it); 
    } 

    return maxfd; 
} 

這真的什麼並不重要clients是,這只是空的,意味着一旦客戶端連接到被填充,自第一次進來的連接整個事情的段錯誤沒有發生。

而且,這裏的一些示例輸出:

readable: 1, sockfd: 3, maxfd: 3 
Segmentation fault 

我可以在這裏得到的東西:

  • 的調用select()作品,readable設置正確
  • sockfdmaxfd是有效的描述符。

恐怕我無法爲您提供任何調試信息(例如gdb),因爲我正在進行交叉編譯,並且gdb在編譯的平臺上不可用。

+0

什麼是'build_fd_set'方法?和'套接字'聲明/初始化在哪裏? – Random832

+0

這個 - > sockfd會發生什麼? –

+0

什麼是套接字?你如何初始化它? –

回答

0

沒關係,我想通了。 * 笨我 *

原來,segfault從來沒有真正發生在可疑的位置,segfault之前的最後一個printf從未顯示,因爲stdout沒有被刷新。實際的段錯誤稍後發生,當然是我的錯誤。

thx不過