닫힌 descriptor와 write, SIGPIPE

08 Jan 2011

c io

예전에도 엄청 고생했던 것인데, socket이나 pipe 등에서 readwrite로 IO를 수행할 때 상대쪽(opposite endpoint)이 닫혔다면 어떤 현상이 벌어질까?

  • read는 -1을 반환한다
  • write는 SIGPIPE를 받는다.

하지만 프로그램이 signal handler를 만들지 않았다면 그 프로그램은 죽는다.
SIGTERM이나 SIGQUIT를 받은게 아니기 때문에 조용히 죽는다.

send/recv를 사용해서 옵션을 주면 깔끔하게 EPIPE를 반환하게 할 수 있는데 write, read는 그런 옵션이 생략된 범용적 함수라서 signal handler를 설치하는 수 밖에 없다.

stackoverflow에 나와있는 how to prevent sigpipes or handle them properly를 보면

int set = 1;
setsockopt(sd, SOL_SOCKET, SO_NOSIGPIPE, (void *)&set, sizeof(int));

와 같이 해결가능하다고 하는데 범용적이지는 않다.

그래서 결국 sigaction으로 handler 설치해주고 작업을 해야하는데 단, signal 함수를 써서 handler를 지정했다가는 os에 따라서 한번밖에 handler가 설정 안되는 경우가 있으므로 주의가 필요하다.

comments powered by Disqus