티스토리 뷰

728x90
반응형

저수준이란 

표준에 상관없이 운영체제가 독립적으로 제공한다는 의미이다.

리눅스에서 제공하는 저수준 파일입출력 함수를 사용하기 위해서는 파일 디스크립션에 대한 개념을 알아야한다.

 

파일 디스크립터

시스템으로부터 할당 받은 파일 또는 소켓에 부여된 정수를 의미한다. 그저 운영체제가 만든 파일(혹은 소켓)지칭을 편하게 하기 위해서 부여된 숫자이다.(파일 디스크립터에 대한 예제를 살펴보면 이해가 될 것이다.)

(참고로 파일 디스크립터는 파일 핸들러라고도 하는데 이는 윈도우에서 주로 사용하는 용어이다.)

파일 디스크립터   대상
0  표준입력: standartd input
1 표준출력: standartd output
2  표준에러: standartd Error

 

아래의 파일 디스크립터는 별도의 생성과정을 거치지 않아도 프로그램이 실행되면 자동으로 할당되는 파일 디스크립터이다. 파일 디스크립터는 최대 1024까지 사용할 수 있다

 

파일디스크립터 예제

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/socket.h>

int main(void)
{	
	int fd1, fd2, fd3;
	fd1=socket(PF_INET, SOCK_STREAM, 0);
	fd2=open("test.dat", O_CREAT|O_WRONLY|O_TRUNC);
	fd3=socket(PF_INET, SOCK_DGRAM, 0);
	
	printf("file descriptor 1: %d\n", fd1); // file descriptor 1: 3
	printf("file descriptor 2: %d\n", fd2); // file descriptor 2: 4
	printf("file descriptor 3: %d\n", fd3); // file descriptor 3: 5
	
	close(fd1);
	close(fd2);
	close(fd3);
	return 0;
}

 예제를 살펴보면 파일 디스크립터에 대해 잘 이해할 수 있다. 표준 입력, 표준 출력, 표준 에러는 0~2까지 할당되고 3 이후의 파일 디스크럽터를 사용할 수 있으며 파일 디스크립터를 새로 추가할 때 마다 이전에 선언된 파일 디스크립터에 +1이 되어 생성된다.

 파일디스크립터는 단지 파일을 지칭하게 편하게 해주기 위해 사용되니 어렵게 생각하지 말자.

파일 열기

int open(const char *path, int flag);
// (성공 시 파일 디스크립터, 실패 시 -1 반환)

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

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

  • Flag 의미와 표
오픈모드 의미
O_CREAT 필요하면 파일을 생성
O_TRUNC 기존 데이터 전부 삭제
O_APPEND 기존 데이터 보존하고, 뒤에 이어서 저장
O_RDONLY 읽기 전용으로 파일 오픈
O_WRONLY 쓰기 전용으로 파일 오픈
ORDWR 읽기, 쓰기 겸용으로 파일 오픈

 

파일 닫기

int close(int fd);
//(성공 시 0, 실패 시 -1 반환)

 

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

 

파일에 데이터 쓰기

  • 파일에 데이터를 출력(전송)하는 함수
ssize_t write(int fd, const void * buf, size_f nbytes):

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

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

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

 

파일에 저장된 데이터 읽기

  • 데이터를 입력(수신)하는 기능의 함수
ssize_t read(int fd, void *buf, size_t nbytes);

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

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

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

 

fopen과 open의 차이

open은 파일 디스크립터를 반환하지만 fopen은 파일 포인터를 반환합니다.

FILE* fopen (const char* fileName, const char* fileMode)
int open(const char *path, int flag);
// (성공 시 파일 디스크립터, 실패 시 -1 반환)

 

저수준 파일과 리눅스 소켓프로그래밍을 하기 위해 알아야할 파일 디스크립터 개념을 살펴보았다.

 

 

[참조]

윤성우 열혈 TCP/IP 소켓 프로그래밍(책)

728x90
반응형
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/08   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함