파일의 조작

저 수준 파일 입출력 (Low-Level File Access)


리눅스 혹은 윈도우즈 자체에서 제공해 주는 파일 입출력 함수를 사용하여 파일을 관리

(파일의 생성 및 삭제, 데이터 입력 및 출력) 하는것을 의미함.


리눅스에서는 모든 것을 파일로 관리한다.

-파일,소켓,표준 입력(키보드),표준 출력(모니터)

※흔히 표준 입출력 함수라 함은 ANSI 표준에서 제공하는 함수를 말한다.


파일에 파일 디스크립터를 할당해서 관리(파일 디스크립터는 정수)

※여기서 파일은 단순 파일 뿐아니라 소켓,표준 입출력을 포함한 의미이다.


 리눅스는 모든 것을 파일로 간주하기 때문에 파일 입.출력 함수로 소켓을 통한 데이터 전송 및 모니터나 키보드로 부터 데이터를 입.출력 또한 가능하다.

여기서 말하는 입출력함수는 표준입출력 함수가 아니라 리눅스에서 제공하는 입출력함수이다.



파일 디스크립터(File Descriptor)


파일을 관리하기 위해서 모든 파일(파일,소켓,표준 입력,표준 출력)에 파일 디스크립터를 할당 해 준다.


파일 디스크립터 

대상 

표준 입력 (Standard Input)

표준 출력 (Standard Output)

표준 에러 출력(Standard Error)


기본적으로  파일디스크립터는 정수형으로 이루어지면 0~2까지는 위 표처럼 기본적으로 할당 되어있다.


      Program                            Operating System

 




5





7






 <--------------
 





<--------------

 

파일 A


소켓 B


소켓 C


파일 D


만약 위처럼 요청에 따라 운영체제에서 소켓과 파일에 번호를 붙여 주면 프로그램에서 파일의 이름이아닌 넘버링된 숫자만으로 운영체제에 파일의 입력이나 출력등을 요청할수있다.

비유를 하자면 도서관에서 책에 번호를 붙여서 관리를 하는 것이라 보면된다.



File open 및 close


#include<fcntl.h>

#include<sys/types.h>

#include<sys/stat.h>


int open(const char *path, int flag);

open 함수의 const char *path 인자는 열려고하는 파일의 위치와 이름을  함께지니고 있는 문자열을 전달하고 

int flag는 파일을 열때의 모드를 설정하는것이다.

보면 함수의 리턴형이 int 형이다.

이것이 바로 파일 디스크립터 이다.

#include<unistd.h>


int close(int fildes);

닫고자하는 파일의 디스크립터를 인자로 전달하면 된다.


MODE 

의미 

O_CREAT 

 파일이 없으면 생성

O_TRUNC 

존재하던 데이터를 모두 삭제 ,다시 기록

O_RDONLY 

읽기 전용 모드로 파일을 오픈 

 O_WRONLY

쓰기 전용 모드로 파일을 오픈 

O_RDWR 

읽기와 쓰기 모두 가능한 모드로 파일을 오픈 

O_APPEND 

파일이 '추가모드'로 열린다. 파일 포인터가 열린 파일의 마지막 부분을 가리킨다.

 O_EXCL

 

O_NOCTTY 

 

 O_SYNC

 

 O_NOFOLLOW

 결로명이 심볼릭 링크라면,파일오픈이 안된다.

O_DIRECTORY 

경로명이 디렉토리가 아니면,파일오픈이 안된다. 



Data read & write


#include<unistd.h>


ssize_t write(int fildes, const void *buf, size_t nbytes);

ssize_t : signed int ,   size_t : unsigned int 

int fildes 는 데이터를 보낼 파일 디스크립터를 전달하면 된다.

void *buf 는 전달하고자 원하는 데이터의 배열정보

※배열 이름은 상수 포인터이다.

size_t nbytes 전달하고자 원하는 데이터의 크기

#include<unistd.h>


ssize_t read(int fildes, void *buf, size_t nbytes);

위와 같은데 size_t nbytes 는 읽어들일 데이터의 최대크기로 더 큰 데이터가 와도 여기서 지정한 크기까지만 읽어들인다.








+ Recent posts