🚩 파일은 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 발생");
'UNIX 프로그래밍' 카테고리의 다른 글
[1주차 실습] UNIX 실습 문제 (0) | 2023.10.15 |
---|---|
[6주차 개념] UNIX 프로세스 생성과 실행 (1) | 2023.10.13 |
[4주차, 5주차 개념] UNIX 시스템 정보/ 프로세스 정보 (0) | 2023.10.13 |
[3주차 개념] UNIX 파일과 디렉토리 (0) | 2023.09.27 |
[1주차 개념] UNIX 사용법 (+ LINUX와 차이점) (0) | 2023.09.07 |
댓글