[Network] 16. 입출력 스트림의 분리에 대한 나머지 이야기
10장에서는 멀티 프로세스 기반의 스트림 분리에 대해 이야기를 한 적이 있다.
2023.05.28 - [Computer Science/Network Programming] - [Network] 10. 멀티 프로세스 기반의 서버 구현
15장에서는 FILE 구조체 포인터 기반의 분리에 대해 이야기를 나누었다.
2023.05.28 - [Computer Science/Network Programming] - [Network] 15. 소켓과 표준입출력
10장에서 보인 스트림의 분리는 이번에 보일 스트림의 분리와 방법에 있어 차이점이 있다.
파일 디스크립터의 복사와 Half-close
스트림의 분리 이후 half-close가 진행되지 않는 이유
하나의 소켓을 가지고 입력, 출력 스트림을 분리하였다고 해도, 이 중 하나를 대상으로 종료를 하면 half-close가 발생하는 것이 아닌 완전종료가 일어난다.
그래서 위의 경우 fgets가 제대로 작동하지 않는다.
그 FILE 포인터는 분리되었어도 file descripter는 하나이기 때문이다.
그럼 파일 디스크립터를 복사해서 FILE 포인터를 만들어 연결시켜두고 하나만 종료시키는건 어떨까?
이렇게 하면 해당 파일 포인터에 연결된 파일 디스크립터만 소멸된다.
파일 디스크립터의 복사
#include <unistd.h>
int dup(int fildes);
int dup2(int fildes, int filedes2);
두 함수 다 파일 디스크립터를 복사하는 기능을 하며, 두번째 함수는 명시적으로 복사할 파일디스크립터의 위치를 지정할 수 있다.
위와 같은 방법으로 dup를 이용해 파일 디스크립터를 분리하고, file 구조체 포인터를 각각의 디스크립터에 생성하고 있다. 이렇게 되면, shutdown을 진행했을 때 half-close가 실행되게 된다.
'Computer Science > Network' 카테고리의 다른 글
[Network] 18. 멀티쓰레드 기반의 서버구현 (0) | 2023.05.29 |
---|---|
[Network] 15. 소켓과 표준입출력 (0) | 2023.05.28 |
[Network] 14. 멀티캐스트 & 브로드캐스트 (0) | 2023.05.28 |
[Network] 13. 다양한 입출력 함수들 (0) | 2023.05.28 |
[Network] 12. IO 멀티플렉싱 (0) | 2023.05.28 |