반응형
소켓통신시 fd 에러 문제발생
stdin / stdout / stderr 가 정의 되지 않으면 문제가 발생하는 경우가 생긴다.
대표적인 경우가 accept() 함수인데.. 네트워크 소켓을 열었을 때, FD 가 stdin / stdout / stderr 인 0,1,2 중에 하나면, 네트워크 통신하는 코드에서 에러를 뿜는다.
증상재현시키기
어플리케이션실행 초기에 다음과 같은 코드를 넣으면된다.
close(0);
close(1);
close(2);
위와같은 코드를 넣으면, 다음에 열리는 fd가 0 부터 열리므로 문제가 발생하게 된다.
문제해결
close(0);
close(1);
close(2);
stdin = freopen("/dev/null", "r", stdin);
stdout = freopen("/dev/null", "w", stdout);
stderr = freopen("/dev/null", "rw", stderr);
프로그램 초기에 위와같이 각종 표준 입출력을 재정의 한다.
위의 코드는 c 코드 표준스타일이다.
참고사항
각종 표준입출력의 재정의는 서버/클라이언트 네트워크 프로그램에서 자주 사용하는 기법이다.
이유는 각종 보안의 이슈로 로그를 외부에 뿌리지 않게 하기위해서 표준입출력을 재정의하는것이다.
반응형