2011-12-16 3 views
1

서버에 연결 한 후 서버에서 데이터가 있는지 확인하기 위해 15 초의 시간 제한을 가진 select()를 호출하는 C 프로그램에서이 문제가 발생합니다. 그것은 정상적으로 작동하지만 select()에서 신호 6 (SIGABRT)의 이 때때로 발생하기 때문에 충돌합니다. 누군가가 알 수 있습니까 언제 선택() 중단 할 수 있습니까? 기능 wait_until_writable()에 대한프로그램이 select() 내에서 중단되었습니다. 언제 일어날 수 있습니까?

(gdb) bt 
#0 0x29309527 in select() from /usr/lib32/libc.so.6 
#1 0x2921530c in select() from /usr/lib32/libpthread.so.2 
#2 0x284ac0c0 in wait_until_writable (fd=48, timeout=15) 

샘플 코드 :

나는 SIGABRT 발생했습니다
int wait_until_writable(int fd, int timeout) 
{ 
    int n, error; 
    socklen_t len; 
    struct timeval tv; 
    fd_set wfd; 
    tv.tv_sec = timeout; 
    tv.tv_usec = 0; 
    error = 0; 
    FD_ZERO(&wfd); 
    FD_SET(fd,&wfd); 
    // XXX An improvement would be to loop while errno=EINTR 
    n = select(fd+1, NULL, &wfd, NULL, &tv); 
    if (n > 0 && FD_ISSET((int)fd, &wfd)) { 
     len = sizeof(error); 
     if (getsockopt(fd, SOL_SOCKET, SO_ERROR, &error, &len) < 0) { 
      return -1; 
     } 
     if (error) { 
      return -1; 
     } 
     return 0; 
    } 
    return -1; 
} 
+0

이에 대한 대답을 얻으려면 몇 가지 샘플 코드와 추가 정보를 제공해야합니다. select() 자신의 함수입니까? –

+0

아니요, 시스템 호출입니다. –

답변

0

몇 가지 사례 : 가능성으로 인해

  1. 어설 실패 (내부 함수 호출에 잘못된 인수를, 메모리 손상 버그).

  2. 닫힌 포트에서 읽거나 쓰려고 시도합니다 (일반적으로 I/O 오류가 발생합니다).

  3. 비영어 직렬 포트를 통한 이진 데이터 전송은 중단 문자로 중단됩니다.