현생/TCP 소켓 프로그래밍

15. 표준 입출력 함수와 파일 디스크립터의 비교 및 변환 [TCP/IP][C][LINUX]

푸더기 2022. 2. 11. 20:32
반응형

표준 입출력 함수의 장점은 이식성이 좋고, 버퍼링을 통해 성능을 향상시킬 수 있습니다.

소켓을 생성할 때 운영체제는 입출력을 위한 버퍼를 생성하는데, 표준 입출력 함수를 사용하면 추가 버퍼를 제공받습니다. 만약 문자열을 전송한다고 할 때, 먼저 표준 입출력 함수의 버퍼에 저장된 후 소켓의 출력버퍼로 이동한 후 전송됩니다.

버퍼링을 통해 전송하는 데이터를 묶어서 출력 버퍼로 보냄으로 출력버퍼로 데이터 이동 횟수가 줄어들어서 성능을 향상시키게 됩니다. 1바이트를 10회 이동시키는 시간이 10바이트를 1회 이동시키는 시간보다 10배 가까운 시간이 소모된다고 합니다.

 

표준 입출력 함수의 단점은 양방향 통신이 쉽지 않고, 상황에 따라 fflush함수(파일 스트림 버퍼를 비우는 함수)를 자주 사용하게 되며, 파일 디스크립터를 FILE 구조체의 포인터로 변환해야합니다. 버퍼링에 의해 읽기와 쓰기간 변환을 위해선 fflush함수를 호출해야 하고 이 경우 성능에 문제가 생길 수 있습니다.

 

#include<stdio.h>

FILE* fdopen(int fildes, const char * mode);
//success: FILE 구조체 포인터  fail: NULL

fildes에 파일 디스크립터를 인자로 전달하고, mode에는 "r"이나 "w"와 같은 FILE 구조체 포인터의 모드 정보를 전달합니다. 이 함수를 통해 파일 디스크립터를 FILE 포인터로 변환 가능합니다.

 

#include<stdio.h>

int fileno(FILE * stream);
//success:파일 디스크립터  fail:-1

반대로 FILE 포인터를 파일 디스크립터로 변환하기 위해선 fileno 함수를 사용하면 됩니다.

반응형