운영체제/리눅스

[리눅스] 파일 I/O_2

Cloud_Park 2022. 7. 31. 12:40

2022.07.31 - [운영체제/리눅스] - [리눅스] 쉘스크립트_1

2022.07.31 - [운영체제/리눅스] - [리눅스] 쉘스크립트_2(awk,sed)

2022.07.31 - [운영체제/리눅스] - [리눅스] 파일 I/O _1

 

파일 열기(open)

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int open(const char *pathname,int flags);
int open(const char *pathname,inst flags, mode_t mode);

 

 

파일은 시스템 호출로 ,열거나 생성할 때 사용

성공하면 해당파일 지시하는 int형 파일 디스크립터를 되돌려준다.

path_name은 생성하거나 열고자하는 파일이름을 나타냄

보통 full path 이름을 적어주고 단지 이름만 적을 경우 현재경로에서 찾는다.

 

flag는 파일을 어떠한 모드로 열 것인지 결정하기 위해 사용

읽기전용, 쓰기전용, 읽기/쓰기전용 모드로 열 수 있다.

각각 O_RDONLY,O_WRONLY,O_RDWR 로 나타낸다.

 

open에 mode인자가 붙은 형식과 붙지 않은 형식 둘다 유효하다.

mode 인자는 파일 생성 시 파일의 권한 (소유권)을 나타내며, 파일을 생성(O_CREAT)하지 않으면 mode인자는 무시됨

정상 수행시 디스크립터 리턴, 에러 발생시 -1

 

 

flag 정리

mode 정리

erron

 

 

 

 

 

파일 열고 닫기

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

close()는 파일 디스크립터를 닫아서 더 이상 파일을 참조하지 않고 재사용 할 수 있도록 합니다.

프로세스와 연관된 프로세스가 소유한 파일에 보유된 모든 레코드 잠금이 제거됩니다.

fd가 열린 마지막 파일 디스크립터인 경우 연관된 자원이 해제됩니다.

파일 디스크립터가 unlink를 사용하여 제거된 파일에 대한 마지막 참조인 경우 파일이 삭제됩니다.

 

정상 수행시 파일 디스크립터 리턴, 에러시 -1

 

erron

 

 

파일 열고 닫기(fcntl)

#include <unistd.h>
#incdlue <fcntl.h>
int fcntl(inst fd, int cmd,.../*arg*/);

fcntl()은 파일 디스크립터를 조작합니다.

열린 파일 디스크립터 fd에 대한 아래 설명된 작업 중 하나를 수행합니다.

작업은 cmd에 의해 결정됩니다.

선택적으로 세 번째 인수를 취할 수 있으며, 필요 여부는 cmd에 의해 결정됩니다.

인수가 필요하지 않는 경우 void가 지정

 

 

CMD

파일 디스크립터 복제

복사된 파일 디스크립터는 잠금, 파일 위치 포인터, 플러그 등을 공유

 

파일 상태 플러그

F_GETFL(VOID) : 파일 디스크립터에 대한 플래그값을 되돌려준다.

F_SETFL(INT) : arg 에 지정된 값으로 파일 디스크립터 fd의 플래그를 재 설정한다.

현재는 O_APPEND,O_ASYNC,O_DIRECT,O_NONLOCK만을 설정할수 있따.

 

레코드 잠금

F_SETLK(struct flock *) 잠금을 획득하거나 잠금을 풀기 위해서 사용

F_SETLKW(struct flock *): F_SETLK 과 같은 일을 하지만 , 에러 리턴하는 대신 잠금이 풀릴때 까지 대기

F_GETLK(struck flock *) 잠금이 있는지 검사

 

struck flock{

short int l_type; //잠김타입

short int I_whence; //파일의 절대 위치

__off_t I_start; //파일의 offset

__off_t I_len; //잠그고자하는 파일의 길이

__pid_t I_pid; //잠금을 얻은 프로세스 아이디

}

 

 

 

파일 읽고 쓰기(read)

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

 

socket(), open()등으로 열린 파일 디스크립터에서 파일을 읽어 들인다.

fd에 읽을 데이터가 있다면buf에 담아서 가져온다.

count는 buf에 한번에 가져올 데이터의 크기를 의미한다.

 

성공은 0 이상값을 변환 0이면 파일의 끝을 의미하고 데이터를 가져오는데 성공한다면 파일 포인터의 위치는 읽은 데이터 크기만큼 이동,에러는 -1

 

 

파일 읽고쓰기 (write)

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

 

open (),socket() 등으로 열린 파링 디스크립터가 가리키는 파일에 쓴다.

buf는 쓸 데이터이며 count는 쓸데이터의 크기이다.

 

성공할 경우 쓰여진 바이트 크기 만큼 리턴된다.

0은 쓰여진게 없다. -1일 경우 에러 발생

 

 

파일 읽고 쓰기(lseek)

 

#include <sys/types.h>
#incdlue <unistd.h>
off_t leek(int fd, off_t offset, int whence);

lseek() 는 열린 파일 디스크립터 fd의 위치 포인터를 offset만큼 위치 변경한다.

위치 변경 시 whence를 이용해 기준점을 정할 수 있다.

 

SEEK_SET

-파일 처음 기준으로 계산

SEEK_CUR

  • 파일의 현재 위치 기준으로 계산

SEEK_END

  • 파일의 마지막 기준으로 계산

성공시 시작으로 멀어진 byte만큼 offset을 리턴

실패시 -1

 

 

예제-데이터 파일 변환_점유 확인(코드 블럭으로 변환 예정)