SW 개발

[linux system app] stdin stdout stderr 에 대한 재정의 : 소켓통신시 fd 에러 대처

. . . 2014. 4. 8. 14:10
반응형

소켓통신시 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 코드 표준스타일이다.

참고사항

각종 표준입출력의 재정의는 서버/클라이언트 네트워크 프로그램에서 자주 사용하는 기법이다.

이유는 각종 보안의 이슈로 로그를 외부에 뿌리지 않게 하기위해서 표준입출력을 재정의하는것이다.

반응형