본문으로 바로가기

파일 입출력 - 개요, 열기/닫기

category Linux 2021. 9. 14. 01:43

1. 파일 개요 & 기본 명령어


File

  • 보조 기억 장치에 저장된 연관된 정보들의 집합
  • 보조 기억 장치 할당의 최소단위
  • 물리적 정의
  • File operations
    • Create, Write, Read, Reposition, Delete, Etc
  • OS는 file operations들에 대한 system call을 제공해야 함

  

Types of files in Unix/Linux

  • Regular file(일반 파일): Text or Binary data file
  • Directory: Unix/Linux에서는 directory도 하나의 파일
  • Special file(특수 파일): 파일 형태로 표현된 커널 내 객체, 데이터 전송이나 장치 접근 시 사용하는 파일

  

File acess permission

  • 사용자: 소유자(Owner), 그룹(Group), 기타(Others)
  • 권한: 읽기(r), 쓰기(w), 실행(x)

    

Basic commands for file

  • ls(list) : 현재 directory 내 파일 목록 출력
    • -l : 상세 파일 정보 출력 (long)
    • -a : 모든 파일(숨겨진 파일 포함) 목록 출력 (all)
$ ls
$ ls -a
$ ls -al

    

  • touch: 빈 파일 생성 or 파일의 time stamp 변경
  • mkdir: 빈 디렉토리 생성
$ touch emptyFile
$ mkdir testDir

  

  • rm(remove): 파일 삭제
    • -r : directory 삭제
$ rm emptyFile
$ rm -r testDir

  

  • cat(concatenate) : 파일 내용 출력
$ vi myName
$ cat myName
jimin

  

  • cp(copy) : 파일 복사
    • -r : directory 복사
$ cp myName myNameCopy

$ ls
myName myNameCopy

$ cat myNameCopy
jimin

 

  • mv(move) : 파일 이동 or 이름 변경
$ mv myName myNameMove

$ ls
myNameCopy myNameMove

  

  • chmod(change mode): 파일 권한 변경
    • 8진수 L: 4, W: 2, X: 1로 222는 소유자, 그룹, 기타 사용자에 www 권한을 준다.
    • u + r : user(소유자)에게만 r(읽기) 권한을 준다.
$ chmod 222 permission
$ chmod u+r permission

  

    

2. 파일 열기/닫기


Low-Level File IO (System call)

  • System call을 이용해서 파일 입출력 수행
  • File descriptor 사용
  • Byte 단위로 디스크에 입출력
  • 특수 파일에 대한 입출력 가능

  

High-Level File IO (Buffered IO)

  • C Standard library를 사용해서 파일 입출력 수행
  • File pointer 사용
  • 버퍼(block) 단위로 디스크에 입출력: 여러 형식의 입출력 지원

  

Man Page: 시스템 사용 설명서
$ man [options] [section] page

1: shell
2: system call

  

Opening files - open(2)

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

int open (const char *pathname, int flags [, mode_t mode]);
  • pathname(file path): 열려는 파일의 경로(파일 이름 포함)
  • flags(file state flags): 파일을 여는 방법(access mode) 설정
    • 여러 플래그 조합 가능 (OR bit operation ( | ) 사용)
    • ex) O_WRONLY | O_TRUNC, O_RDWR | O_APPEND
종류 기능
O_RDONLY 파일을 읽기전용으로 연다.
O_WRONLY 파일을 쓰기전용으로 연다.
O_RDWR 파일을 읽기와 쓰기가 가능하게 연다.
O_CREATE 파일이 없으면 파일을 생성한다.
O_APPEND 파일의 맨 끝에 내용을 저장한다.
  • mode(file access permission): 파일을 새로 생성(O_CREATE) 할 때만 유효
    • 파일 권한 설정 값 사용
    • 정의된 플래그 사용: 조합하여 사용 가능  (OR bit operation ( | ) 사용)
    • ex) S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH
  • Return: file descriptor

File descriptor

  • 열려 있는 파일을 구분하는 정수(integer) 값
    • 특수 파일 등 대부분의 파일을 지칭 가능
    • Process별로 kernel이 관리
  • 파일을 열 때 순차적으로 할당 됨 (Process 당 최대 fd 수 = 1,024)
  • Default fds(수정가능) - 0 : stdin, 1 : stdout, 2 : stderr
int openFile(void) {
	int fd = open("hello.txt", O_RDWR);
	if (fd == -1) {
		perror("File Open");
		exit(1);
	}
	return fd;
}

int main(void) {
	int fd = 0;
    
	fd = openFile(); printf("fd = %d\n", fd);
	close(fd);
    
	close(0);
    
	fd = openFile(); printf("fd = %d\n", fd);
	close(fd);
    
	return 0;
}
$ gcc -o allocFD.out allocFD.c

$ ./ allocFD.out
fd = 3
fd = 0

File table

  • 열린 파일을 관리하는 표
    • Kernel이 process 별로 유지
    • 열린 파일에 대한 각종 정보 관리: Acess mode, file offset, pointer to files

    

Closing files - close(2)

#include <unistd.h>

int close (int fd);
  • fd(file descriptor): 닫으려는 file descriptor
  • Return - 0 : sucess, 1 : error

  

Error handling for system call

  • System call은 실패 시 -1을 반환
  • Error code는 errco에 저장됨
  • perror(3) : Error message를 출력해주는 함수
#include <stdio.h>

void perror (const char *str);

  

Open & Close a file

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>

int main(void) {
	int fd;
	mode_t mode;
    
	mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH; // 644
    
	fd = open("hello.txt", O_CREAT, mode);
	if (fd == -1) {
		perror("Creat"); 
        	exit(1);
	}
	close(fd);
    
	return 0;
}
$ ls hello.txt
ls: cannot access 'hello.txt': No such file or directory

$ vi fileOpenClose.c

$ gcc -o fileOpenClose.out fileOpenClose.c

$ ./fileOpenClose.out

$ ls -l hello.txt
-rw-r--r-- 1 jimin jimin 0 Aug 29 17:24 hello.txt

    

 

'Linux' 카테고리의 다른 글

파일 입출력 - 읽기/쓰기, File descriptor  (0) 2021.09.14