Lacti's Archive

닫힌 descriptor와 write, SIGPIPE

January 08, 2011

예전에도 엄청 고생했던 것인데, 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가 설정 안되는 경우가 있으므로 주의가 필요하다.

Loading script...