SIGALRM에 의한 시간 만료가 write에서 실패합니다.
글쓴이: 김경태 / 작성시간: 금, 2003/05/16 - 5:04오후
SOURCE CODE:
int writen(int fd, const void *vptr, size_t n) { size_t nleft; int nwrite; const char* ptr; signal(SIGALRM, sig_alrm); ptr = (char *)vptr; nleft = n; alarm(10); while (nleft > 0) { if ( ((int)nwrite = write(fd, ptr, nleft)) <= 0) { if (errno == EINTR) return -1; else if(errno == EPIPE) return -2; else return (-3); } nleft -= nwrite; ptr += nwrite; } alarm(0); return (n); } static void sig_alrm(int signo) { return; }
질문:
위와 같은 Code를 사용하여 Select에 의한 다중 접속의 프로그램을 구현했습
니다.
그런데 위의 소스를 이용하여 peer에 data 송신시 프로그램이 block된채로
움직이지 않는 경우가 있습니다.
어떤 경우이던지 write함수 호출은 SIGALRM을 받고 적어도 10초이내에 err
no == EINTR의 경우를 만나서 return이 되어야 함에도 불구하고 계속 write
함수에서 sleeping하고 있습니다.
과연 어떤 경우에 write가 SIGALRM에도 불구하고 BLOCK상태가 될 수 있는
것인지...그게 궁금합니다.
고수님들의 친절한 가르침을 부탁드립니다. ^^;
Forums:
참조하세요...
음.. 구냥, 참조만 하시기를...
alarm 은 시스템의 상태에 따라서 유실될수도 있어서,
신뢰할만하지 못하다고 합니다.
select 를 사용하신다면,
fd 를 non-blocking 으로 만드신다음에,
write 한후 fail 시에,
errno 가 EWOULDBLOCK 이다면,
재전송해주는게 좋을듯 합니다.
댓글 달기