2010-05-19 4 views
1

글쎄 .. 내 errno 변수를 검사 할 때 "Illegal Seek"오류가 발생하는 것 같습니다. 문제는 그게 무슨 뜻인지 전혀 모른다는 것입니다.accept()를 호출 한 후 "Illegal Seek"오류가 발생합니다.

나는 소켓이 유닉스에서 파일처럼 다루어진다는 것을 알고있다. 그러나 이것이 어떻게 소켓과 관련 될 수 있는지 나는 알 수 없다. 내가 정확히하고 있어요 것은 :

int sck = ::accept(m_socket, (struct sockaddr*)&client_address, (socklen_t*)&address_len); 

은 그 때 나는 SCK = -1의 errno = ESPIPE

을 얻을 그리고 이상한 점은 무작위로 발생한다는 것입니다. 내 말은, 때로는 코드가 제대로 작동하고 때로는 예외가 발생하기도합니다. 이해할 수 있도록 스레드로 작업하고 있습니다. 그러나 나는 단지 어떤 종류의 동작이 ESPIPE로 errno를 설정하도록 accept() 호출을하는지 알고 싶습니다. 그래서 매개 변수를 검사 할 수 있습니다.

감사 넬슨 R. 페레즈

+1

실행 파일에'strace'를 실행 해 보셨습니까? 'accept '가 실패하는 방식을보다 명확하게 볼 수 있습니다. 'man' 페이지에는'ESPIPE'에 관한 내용이 없습니다. –

답변

1

가장 가능성있는 원인은 m_socket 변수가 손상되고 있다는 점이다. @Aidan이 accept(2)으로 전달되는 값을 확인하거나 프로세스에 디버거를 연결하고 watchpoint을 해당 메모리 위치에 설정하도록 제안하면 strace을 사용하십시오.

+0

변수 일 필요는 없습니다. 파일 설명자가 닫혀 있고 다른 파일이 열리고 동일한 번호가 지정되었을 수 있습니다 (항상 순차적으로 할당되므로). –

+0

흠, 가능합니다. 그것은 부패로 분류 될 수 있습니다 :) 그리고 watchpoint는 그것이 변경되는 곳을 보여줄 것입니다. –

관련 문제