본문 바로가기

CS/컴퓨터 네트워크

실습 1-3. 저수준 파일 입출력과 파일 디스크립터

* 저수준 파일 입출력

write() read()

운영체제가 제공하는 함수 기반 파일 입출력

표준이 아니라서 운영체제에 대한 호환성이 없음

리눅스는 소켓도 파일로 간주해서 저수준파일 입출력함수를 기반으로 소켓 기반의 데이터 통신 가능

 

*파일 디스크립터

운영체제가 만든 파일을 구분하기 위한 일종의 숫자

저수준 파일 입출력 함수는 입출력을 목적으로 파일 디스크립터를 요구함

조수준 파일 입출력 함수에게 소켓의 파일 디스크립터를 전달하면 소켓을 대상으로 입출력을 진행

파일 디스크립터 대상
0 표준입력
1 표준출력
2 표준에러

 

[파일 열기 닫기]

#include <sys/type.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(const char* path, int flag);

path : 파일 이름을 나타내는 문자열의 주소값 전달

flag : 파일의 오픈 모드 정보 전달

 

#include <unistd.h>
int close(int fd);

fd : 닫고자 하는 파일 또는 소켓의 파일 디스크립터 전달

 

open함수 호출 시에 반환된 파일 디스크립터를 이용해서 파일 입출력을 진행하게 됨

 

- 오픈 모드

O_CREAT : 필요하면 파일을 생성

O_TRUNC : 기존 데이터 전부 삭제

O_APPEND : 기존 데이터 보존하고, 뒤에 이어서 저장

O_RDONLY : 읽기 전용으로 파일 오픈

O_WRONLY : 쓰기 전용으로 파일 오픈

O_RDWR : 읽기 쓰기 겸용으로 파일 오픈

 

 

[파일에 데이터 쓰기]

#include <unistd.h>
ssize_t write(int fd, const void* buf, size_t nbytes);

fd : 데이터 전송대상을 나타내는 파일 디스크립터 전달

buf : 전송할 데이터가 저장된 버퍼의 주소 값 전달

nbyte : 전송할 데이터의 바이트 수 전달

 

[파일에 저장된 데이터 읽기]

#include <unistd.h>
ssize_t read(int fd, void* buf, size_t nbyte);

fd : 데이터 수신대상을 나타내는 파일 디스크립터 전달

buf : 수신한 데이터를 저장할 버퍼의 주소 값 전달

nbytes : 수신할 최대 바이트 수 전달

 

 

*

write(clnt_sock, message, sizeof(message));

read(sock, message, sizeof(message)-1);

 

write(fd, buf, sizeof(buf));

read(fd, buf, sizeof(buf));

 

write, read 함수는 파일 입출력뿐만 아니라 소켓에도 사용할 수 있음 왜냐면 소켓도 파일로 취급되니까~