네트워크프로그래밍 16 입출력 스트림의 분리에 대한 이야기

zh025700·2022년 5월 14일
0

네트워크 프로그래밍


16. 입출력 스트림의 분리에 대한 이야기

스트림이란... 데이터의 송수신을 위한 경로!!

fopen 함수를 통해 스트림이 생성된다고 한다

입출력 스트림의 분리

fork()를 통해 파일디스크립터를 분리해 입 출력을 나누는 것도 분리다,
뭐 디스크립터가 구분되는 것은 아니지만, 용도를 구분했으므로 분리라 할 수 있다.

fdopen을 통해 읽기,쓰기의 파일 포인터를 생성하는 것도 스트림의 분리로 할 수 있다.

스트림 분리의 이점

  1. fork를 통한 스트림의 분리
    • 입 출력을 나누어 구현의 편의성
    • 속도 향상의 기대
  2. 파일 포인터를 통한 스트림의 분리
    • 파일 포인터는 읽기, 쓰기 모드를 구분해야함으로 분리
    • 구분을 통한 구현 편의성
    • 버퍼를 분리함으로써 버퍼링 기능의 향상

=> 스트림의 분리 방법, 분리 상황이 달라지면 이점에도 차이가 존재

스트림 분리 이후의 문제점

fork()를 통한 스트림 분리에선 shutdown()을 이용해 Half-close를 실행했다.
그렇다면 파일 포인터를 이용한 스트림 분리에선 어떻게 하느냐??
아마... 입 출력 중 하나의 포인터만 닫으면 나머지 포인터는 살아있으니 half-close를 할 수 있찌 않을까?

안된다!!! fclose()를 통해 하나의 포인터를 닫으면 Half-close가 아닌, 입출력을 모두 닫아버린다!!

같은 파일디스크립터를 이용해 만든 파일 포인터들 중 하나를 fclose를 통해 없애면, 파일 디스크립터가 소멸이 되고 결국 소켓이 소멸이 된다.

그럼 어떻게 하지...

파일 디스크립터의 복사와 Half-close

스트림 종료 시 Half-close가 되지 않은 이유

하나의 파일 디스크립터를 기반으로 파일 포인터를 생성했기 때문에 fclose()를 호출 시 파일 디스크립터가 종료되어 소켓이 완전 종료됨!

해결법??

파일 디스크립터를 복사하면 된다...

하나의 파일디스크립터에서 포인터를 만들지 말고 파일 디스크립터를 복사해 포인터를 만들자!

  • 디스크립터를 복사 후 각각 디스크립터의 파일포인터를 만들면 Half-close가 가능하다

그렇게 된다면 소켓의 모든 파일디스크립터가 소멸이 되어야 소켓도 소멸이 된다

그렇지만 아직은 half close가 안된다

  • 파일디스크립터 하나가 남으면 이를 통해 입출력이 가능하다
    • 별도의 과정을 거쳐야한다
      • shutdown(fd,종료스트림)을 통해 파일디스크립터를 없애면 복사된 파일디스크립터 수에 상관없이 half close가 진행

파일디스크립터 복사

fork()와 달리 새 프로세스를 생성하지 않고 원본과 복사본의 디스크립터가 하나의 프로세스에 존재해야한다
=> 하나의 프로세스 내에 동일한 파일에 접근할 수 있는 파일디스크립터가 두개 존재해야함!

dup & dup2

int dup(int fildes);
int dup2(int fildes, int fildes2)
  • 성공 시 복사된 파일 디스크립터, 실패시 -1
  • fildes: 복사할 파일 디스크립터
  • fildes2: 지정할 파일디스크립터의 정수 값
  • dup2는 복사된 파일 디스크립터 정수 값을 지정할 때 사용.
    • fildes를 fildes2에 복사해서 사용!!
fd1 = dup(1);
fd2 = dup(fd1,5);

fd2에 stdout 파일 디스크립터가 복사되고 fd2는 5의 값을 가진다!

  • 즉 fd 5는 stdout 기능을 한다

복사 후 스트림 분리

파일 디스크립터로 파일 포인터를 생성할 때 dup을 사용해 소켓을 복사하면 된다!

이 후 shutdown(fileno(파일 포인터),종료스트림)을 이용해 Half-close를 한다.

  • EOF가 전송이 된다!
  • fileno를 이용해 포인터의 디스크립터를 알아낸 후 shutdown을 진행한다.
  • 이 후 포인터를 fclose하면 된다!
  • 복사된 파일디스크립터 수에 상관없이 half-close가 진행된다
profile
정리

0개의 댓글