본문 바로가기
UNIX 프로그래밍

[2주차 개념] UNIX 파일 입출력

by 서영선 2023. 9. 27.

 

🚩 파일은 Byte들의 linear sequence라 볼 수 있다.

 

✔ file descriptor : 현재 open된 file을 구분할 목적으로 UNIX가 붙여 놓은 번호

표준 입출력
-  0 : 표준 입력
-  1 : 표준 출력
-  2 : 표준 오류 출력 

한 프로세스가 동시에 open 할 수 있는 file의 개수에는 제한이 있으므로, open후에는 close를 사용해야 한다.

 

 

 

 

 

 

 

 

✔ open 시스템 호출 기존의 file을 open하거나, 새롭게 file을 생성하여 open하는 system call

 

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

int open(const char * filename, int oflag, [mode_t mode]);
  • filename : 파일 이름
  • oflag :
file 을 access 하는 방식 file 을 create 하는 방식 
O_RDONLY : 읽기 전용
O_WRONLY : 쓰기 전용
O_RDWR : 읽기 쓰기용
O_CREAT : 파일이 없으면 생성
O_EXCL : O_CREAT 옵션과 함께 사용 시, 기존에 없는 파일이면 파일을 생성하고, 기존에 있으면 파일을 생성하지 않고 오류 출력
O_TRUNC : 기존에 파일이 있어도, 기존 파일을 모두 지우고 파일 생성
O_APPEND : 파일의 맨 끝에 내용 추가

 

  • mode : file을 새로 생성할 때만 사용 (ex) 0600, 0644 등등
  • return 값 : 실행 성공 시 file descriptor (음이 아닌 정수); 실행 실패 시 -1;

 

 

 

 

 

 

 

✔ creat 시스템 호출 :  file을 생성하여 open하거나, 기존 file을 open하는 system call

 

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

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

※ 주의 사항: creat는 open을 O_WRONLY, O_CREAT, O_TRUNC 플래그와 함께 사용한 것과 같은 동일한 기능을 가진다.

따라서, file이 이미 존재하면, 두번째 인자인 mode는 무시하고, 기존 file은 0으로 open한다.

 

 

 

 

 

 

✔ close 시스템 호출 : open 된 file을 close 할 때 사용

process 종료 시, open된 file들은 자동으로 close되지만, 동시에 open 할 수 있는 file 수 제한 때문에 close를 사용해야 한다.

#include <unistd.h>
int close(int filedes);
  • filedes : open된 file의 file descriptor
  • return 값: 성공 시 0, 실패 시 -1

 

 

 

 

 

✔ read 시스템 호출 : open된 file로부터 지정한 byte수 만큼의 data를 읽어 지정된 저장 장소에 저장하는 명령

  • file pointer 또는 read-writer pointer: 읽혀질 다음 byte의 위치를 나타냄
#include <unistd.h>

ssize_t read(int filedes, void *buffer, size_t nbytes);
  • filedes : open 된 file의 file descriptor
  • *buffer : 읽은 data를 저장할 곳의 주소, data type은 상관없음
  • nbytes : 읽을 byte 수, data type에 상관없이 지정된 byte 수만큼 읽음
  • return 값 : 성공 시, 실제 읽힐 byte 수, 실패 시 -1  (nbytes 이면, file에 남은 data가 nbytes 보다 적을 때, 더 이상 읽을게 없으면 return 값은 0)
텍스트 파일 : 순차적으로 읽기, 쓰기만 가능
바이너리 파일 : 랜덤 액세스 가능(원하는 위치에서 읽기, 쓰기 가능)

 

 

 

 

 

✔  write 시스템 호출 : 지정된 저장 장소에서 지정한 byte 수 만큼의 data를 읽어 open 된 파일에 쓰는 명령

  • file pointer 또는 read-writer pointer: 쓰여질 다음 byte의 위치를 나타냄
#include <unistd.h>

ssize_t write(int filedes, const void *buffer, size_t nbytes);
  • filedes : write를 할 file의 descriptor
  • *buffer : write 할 내용이 들어 있는 저장 장소의 주소
  • nbytes : write할 byte의 수
  • return 값 : 쓰여진 byte 수 또는 -1 (보통 return 값은 n과 같지만, retrun 값이 n보다 작으면 쓰는 도중 media가 다찼다는 뜻이다. 만약 쓰기전에 꽉 차면, -1이 return 된다.)

 

 

 

 

 

 

 

 

✔ read/write의 효율성 : FIle을 copy하는 프로그램의 실행 시간

  • BUFSIZE가 512의 배수일 때, 효율적
  • system call의 수가 적을 수록 효율적

 

 

 

 

 

✔ lseek 와 임의 접근 : open 된 file 내의 특정 위치로 file pointer를 이동 시키는 system call

#include <sys/types.h>
#include <unistd.h>

off_t lseek(int filedes, off_t offset, int whence);
  • filedes : open된 file의 file descriptor
  • offset : whence에서 offset 만큼 떨어진 위치로 이동, +/- 로 방향 설정 가능
  • whence : SEEK_SET (file 시작 지점), SEEK_CUR (현재 file 위치), SEEK_END (file의 끝 지점)
  • return 값 : 이동된 위치 (시작점부터의 위치), 이동 실패 시 -1

 

 

 

 

 

 

✔ file의 제거

#include <unistd.h>
int unlink(const char * filename);


#include <stdio.h>
int remove(const char * filename);

unlink 는 file 만 삭제,  remove 는 file과 빈 directory 도 삭제  

# open된 파일을 unlink 하면 return 값은 0

 

 

 

 

 

✔ 표준 입출력의 변경

  • redirection : 파일로 표준 입력을 받고, 파일로 표준 출력을 받는 기능

$ ./a.out < infile       : infile이 표준 입력을 받음

$ ./a.out > outfile     : outfile이 표준 출력을 받음

$ ./a.out <infile> outfile      : infile이 표준 입력, outfile이 표준 출력을 받음

 

  • pipe :

$ ./a.out1 | ./a.out2      :  a.out1의 표준 출력이 a.out2의 표준 출력으로

 

 

 

 

 

 

 

 

✔ 오류 메시지 출력

perror("error 발생");

 

 

 

 

 

 

 

 

Lect2 (3).pdf
0.56MB

 

 

 

댓글