스트림이란... 데이터의 송수신을 위한 경로!!
fopen 함수를 통해 스트림이 생성된다고 한다
fork()를 통해 파일디스크립터를 분리해 입 출력을 나누는 것도 분리다,
뭐 디스크립터가 구분되는 것은 아니지만, 용도를 구분했으므로 분리라 할 수 있다.
fdopen을 통해 읽기,쓰기의 파일 포인터를 생성하는 것도 스트림의 분리로 할 수 있다.
=> 스트림의 분리 방법, 분리 상황이 달라지면 이점에도 차이가 존재
fork()를 통한 스트림 분리에선 shutdown()을 이용해 Half-close를 실행했다.
그렇다면 파일 포인터를 이용한 스트림 분리에선 어떻게 하느냐??
아마... 입 출력 중 하나의 포인터만 닫으면 나머지 포인터는 살아있으니 half-close를 할 수 있찌 않을까?
안된다!!! fclose()를 통해 하나의 포인터를 닫으면 Half-close가 아닌, 입출력을 모두 닫아버린다!!
같은 파일디스크립터를 이용해 만든 파일 포인터들 중 하나를 fclose를 통해 없애면, 파일 디스크립터가 소멸이 되고 결국 소켓이 소멸이 된다.
그럼 어떻게 하지...
하나의 파일 디스크립터를 기반으로 파일 포인터를 생성했기 때문에 fclose()를 호출 시 파일 디스크립터가 종료되어 소켓이 완전 종료됨!
해결법??
파일 디스크립터를 복사하면 된다...
하나의 파일디스크립터에서 포인터를 만들지 말고 파일 디스크립터를 복사해 포인터를 만들자!
그렇게 된다면 소켓의 모든 파일디스크립터가 소멸이 되어야 소켓도 소멸이 된다
그렇지만 아직은 half close가 안된다
fork()와 달리 새 프로세스를 생성하지 않고 원본과 복사본의 디스크립터가 하나의 프로세스에 존재해야한다
=> 하나의 프로세스 내에 동일한 파일에 접근할 수 있는 파일디스크립터가 두개 존재해야함!
int dup(int fildes);
int dup2(int fildes, int fildes2)
fildes를 fildes2에 복사해서 사용!!
fd1 = dup(1);
fd2 = dup(fd1,5);
fd2에 stdout 파일 디스크립터가 복사되고 fd2는 5의 값을 가진다!
파일 디스크립터로 파일 포인터를 생성할 때 dup을 사용해 소켓을 복사하면 된다!
이 후 shutdown(fileno(파일 포인터),종료스트림)을 이용해 Half-close를 한다.