2012-08-27 6 views
0

에 나는 오히려 이상한 문제로 실행했습니다는 segfault는 FD_ISSET

내가 소켓 읽을되고 있는지 확인하기 위해 select()를 사용합니다. 그러나 클라이언트가 연결할 때마다 FD_ISSET()을 호출하여 주어진 소켓이 fd_set에 있는지 확인하면 segfault가 발생합니다.

/* [...] */ 

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; 
} 

정말 그냥 빈과 클라이언트가 연결되면 첫 번째 들어오는 연결에 모든 일의 세그먼테이션 폴트 (segfault) 이후 발생되지 않는, 채워지는 의미 clients이 무엇인지는 중요하지 않습니다 .

또한

는 여기에 몇 가지 샘플 출력입니다 :

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

내가 여기 도출 할 수있는 사항은 다음과 같습니다

    통화가 select() 작품, readable는 또한
  • sockfdmaxfd 올바르게 설정되어
  • 있습니다 유효한 설명자.

크로스 컴파일이고 gdb를 컴파일 할 플랫폼에서 사용할 수 없기 때문에 모든 디버깅 정보 (예 : gdb)를 제공 할 수 없습니다.

+0

무엇이'build_fd_set' 방법입니까? 'sockets'은 어디에 선언/초기화됩니까? – Random832

+0

this-> sockfd는 어떻게됩니까? –

+0

'소켓 '이란 무엇입니까? 어떻게 초기화합니까? –

답변

0

신경 쓰지 마, 알아 냈다. * 어리 석음 나는 *

실제로 세그 폴트는 의심되는 위치에서 실제로 발생하지 않았습니다. 세그 폴트가 플러시되지 않았기 때문에 세그먼트가 표시되기 전에 마지막 인쇄본이 표시되지 않았습니다. 실제 segfault는 조금 나중에 발생했고 (물론) 내 실수였습니다.

thx 그럼에도 불구하고