| [ CnUnix ] in KIDS 글 쓴 이(By): ymir (Mizz) 날 짜 (Date): 2002년 11월 22일 금요일 오후 09시 58분 30초 제 목(Title): Re: [Q] read() 중.. EINTR.. 제가봐도 설명이 너무 부실한것 같아 조금 자세히 적습니다.. 음... 이 소켓 프로그램은 제가 처음으로 만들어 본 거라.. 별다른 코드를 사용한 것은 없고.. accept 이후에는 read() 와 write() 로만 클라이언트와 데이터를 주고 받습니다.. 서버 입장에서는.. read_hdr(sock, struct_hdr, size..) read_data(sock, data_stream or struct, size..) send_hdr(sock, struct_hdr, size..) send_data(sock, data_stream, size..) read_ack(sock, struct_hdr..) 와 같은 순서로 루프를 돌고 있고.. 윈도우 클라이언트와 1:1 로 동작을 합니다.. (실제로는 fork() 를 썼기 땜에 여러개의 클라이언트가 붙을 수도 있습니다만.. 기본적으로 1:1 통신을 가정하고 만들었습니다...) 이런 단순한 코드인데.. 첫번째 사이클에서는 이상없이 동작.. 그 다음 사이클에서 read_ack 부분에서 무조건 read() 가 -1 을 한번 리턴하고.. (perror 는 Interrupted system call 를 찍더군요... 에러코드는 EINTR 인것 같습니다) 그 다음에 제대로 된 ack 를 읽어댑니다... 실제로 제가 read() 의 값이 0 이하면 에러 처리를 했기 때문에... 이 부분에서 계속 걸립니다... (물론 -1 를 무시하고 read_ack 한번 더 호출하면 정상적으로 동작할지도..) 제가 찾을 수 있는 자료나 책은 다 찾아 보았는데.. 도무지 이유를 모르겠습니다... 단순히 인터럽트를 막기만 해도 좋은것일까요?? 혹시 왜 발생하는지 원인을 알 수는 없을까요?? 서버는 sparc solaris 8 / gcc3.2 에서 컴파일 했습니다.. 클라이언트는 윈도그 vc++ 다시 한번 더 도움 부탁드리겠습니다.. 감사합니다.. @ 제가 혼자서 책한권 달랑 갖다 놓고 man 만 갖고 코딩을 하느냐구 모르는 게 많습니다.. 가능하시다면 참조할 만한 문서도 같이 언급해 주시면 감사하겠습니다.. ^-^;; Oh, I do believe everlasting love and destiny to meet you again I feel a pain I can hardly stand all I can do is loving you - *Mizz* the Magic Knight! |