파일 다루기

한지용·2021년 3월 29일
0

Operating System

목록 보기
3/7

Role of Operating system: 하드웨어 자원 관리, 프로그램 자원 관리
Kernel : 운영체제의 다른 부분 및 운영체제 프로그램 수행에 필요한 서비스를 제공하는 부분

Kernel의 권한과 사용자가 사용하는 프로그램의 권한이 다를 수 있다. 이 경우 사용하는 것을 커널 수준의 서비스라고 한다.

시스템 호출, 표준라이브러리 함수

  • 사용자가 작성한 프로그램이 커널 수준의 서비스를 사용할 수 있다.
함수의미
open이미 존재하는 파일을 읽기 또는 쓰기용으로 열거나, 새로운 파일을 생성하여 연다
creat새로운 파일을 생성하여 연다
closeopen 또는 creat로 열려진 파일을 닫는다
read열려진 파일로부터 데이터를 읽어 들인다
write열려진 파일에 데이터를 쓴다
lseek파일 안에서 읽기/쓰기 포인터를 지정한 바이트 위치로 이동한다
unlink/remove파일을 삭제한다

cat 함수로 파일 생성


cat>file_name ex): $ cat>data.txt
Hello my world!!
(Save:ctrl+d)

파일 기술자(file descriptor)

시스템으로부터 할당받은 파일을 대표하는 어떤 값으로 파일 열기가 성공하면 음수가 아닌 어떤 정수값; 파일 열기 실패시 -1

  • 커널에 의해서 관리되며 실제 어떤 값인지는 알 필요없음
  • 어떤 경우든 커널에 의해 각 상태가 유일하게 식별되어 관리된다

읽기/쓰기 포인터(read/write pointer)

  • 열린 파일 내에서 읽기 작업이나 쓰기 작업을 수행할 바이트 단위의 위치
  • 특정 위치를 기준으로 한 상대적인 위치를 의미(offset 이라고 칭한다)
  • 파일을 연 직후에 읽기/쓰기 포인터는 0
    파일의 첫 번째 바이트를 가리킨다
    파일의 내용을 읽거나 파일에 새로운 데이터를 작성하면 그 만큼 증가한다
  • 파일 기술자마다 하나씩 존재(서로 다른 프로그램이 동일한 파일을 접근해도 파일 기술자가 다르기 때문에 서로 다른 포인터를 가진다; 즉, 서로의 작업이 상대에게 영향을 주지 않는다)

현재 디렉토리의 절대 경로 확인

$ pwd

디렉토리 삭제

$ rmdir dir_name

OPEN

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

pathname: 개방할 파일의 경로 이름을 가지고 있는 문자열의 포인터(절대경로, 상대경로)
flags: 파일의 개방 방식을 지정한다
mode: 대부분의 경우 생략할 수 있는 값으로 새롭게 생성하는 파일의 초기 접근 권한을 지정
Return: 정상적으로 파일 개방시 파일 기술자를 반환; 파일 개방이 실패할 경우 -1을 반환

flags

flag의미
O_RDONLY읽기만 가능한 상태로 접근
O_WRONLY쓰기만 가능한 상태로 접근
O_RDWR읽기, 쓰기 모두 가능한 상태로 접근

Return
파일 기술자: 프로그램 내에서 파일 기술자는 중복되지 않는다

Return의미
0표준 입력
1표준 출력
2표준 에러

기본적으로 할당되어 있는 파일 기술자들로 파일 개방시 3부터 시작한다

시스템 호출이 실패했을 겨우를 고려한 프로그램 코드

filedes = open("data.txt", O_RDONLY);
/* filedes가 -1이면 open 호출이 실패했다. */
if(filedes == -1)
{printf("file open error!\n"); exit(1);	}

CLOSE

int close(int filedes);

filedes: 이전에 open이나 creat에 의해 개방된 파일의 파일 기술자이다.
Return: 작업이 성공할 경우 0이 반환되며, 실패할 경우 -1이 반환된다.

/* 파일을 읽기 전용 상태로 개방한다. */ 
filedes = open("data.txt", O_RDONLY); 
… 
/* data.txt를 사용하는 코드가 위치 */ 
… 
close(filedes); 

개방된 파일은 사용이 끝난 후 반드시 닫아준다

CREAT

int creat(const char *pathname, mode_t mode);

pathname: 개방할 파일의 경로 이름을 가지고 있는 문자열의 포인터(절대경로, 상대경로)
mode: 새롭게 생성하는 파일의 초기 접근 권한을 지정한다. creat는 존재하지 않는 파일을 새롭게 생성하는 것이 사용 목적이기 때문에 생략할 수 없다.
Return: 정상적으로 파일 개방시 파일 기술자를 반환; 파일 개방이 실패할 경우 -1을 반환

이미 존재하는 파일을 지정하여 creat를 사용하는 경우

  • 해당 파일을 개방함과 동시에 파일이 가지고 있는 데이터를 모두 삭제한다.

READ/WRITE

ssize_t write(int filedes, const void *buf, size_t count); 

filedes: 읽기/쓰기 작업을 수행할 파일에 대한 기술자이다
buf: 파일로 쓰려고 하는 내용이 저장되어 있는 공간이다. 일반적으로 배열을 사용하게 되면 배열의 데이터 형식은 어느 것이라도 상관없다
count: buf에 있는 데이터 중에 실제로 파일로 저장할 데이터의 크기이다

Return: 파일로 쓰기가 성공한 데이터의 크기이다
대부분의 경우 count에서 지정한 값과 동일한 값이 반환된다
만약 count의 값과 반환값이 다르다면 쓰기 작업이 실패한 것이다

LSEEK

off_t lseek(int filedes, off_t offset, int whence); 

filedes: 읽기/쓰기 포인터를 변경할 파일을 지정한다
offset: 새롭게 지정할 읽기/쓰기 포인터의 위치를 의미한다(offset이라 기준에 따라 음수도 가능)
whence: offset의 기준이 된다; 파일의 맨 처음(SEEK_SET); 현재 포인터의 위치(SEEK_CUR); 파일의 맨 마지막(SEEK_END)
Return: 작업이 성공하면 파일의 첫 부분을 기준으로 한 포인터의 오프셋을 반환한다. 작업이 실패할 경우 (off_t)-1이 반환

UNLINK,REMOVE

int unlink(const char *pathname); 
int remove(const char *pathname); 

pathname: 삭제할 파일의 경로 이름이다
Return: 성공시 0, 실패시 -1 반환

0개의 댓글