유닉스 파일 접근
- file : byte들의 linear sequence
- 저수준 파일 입출력 : os와 바로 연결
file descriptor
- 현재 open된 파일을 구분할 목적으로 유닉스가 붙여 놓은 번호
- 표준 입출력
- 0 : 표준 입력 (키보드)
- 1 : 표준 출력 (화면 출력)
- 2 : 표준 오류 출력
- 한 프로세스가 동시에 open할 수 있는 파일의 개수에는 제한이 있음 → close 사용하기
open 시스템 호출
- 기존의 파일을 open하거나, 새로운 file을 생성하여 open하는 시스템 콜
int open(const char *filename, int oflag, [mode_t mode]);
return : file descriptor 번호 / -1
- 인수 사용법
- filename : 파일 이름
- oflag :
- O_RDONLY
- O_WRONLY
- O_RDWR
- O_CREAT - 파일이 없으면 만들고 있으면 기존의 것 open
- O_EXCL - 파일이 존재하면 open 실패 (O_CREAT와 반드시 함께)
- O_TRUNC - 기존에 있는 내용을 지움
- O_APPEND - 원하는 위치에서 file open 가능
- mode : file을 새로 생성할 때만 사용
creat 시스템 호출
- 주의 사항 :
- 파일을 쓰기 가능한 상태로 open
- file이 존재하면, 두번째 인자는 무시; 기존 파일은 0으로 open!
int creat(const char *filename, mode_t mode);
close 시스템 호출
- open된 파일을 close할 때 사용
- 사용 이유 : 프로세스 종료시 open된 파일들은 자동으로 close됨. 그러나 동시에 open할 수 있는 파일 수 제한 때문에 사용하는 것임.
int close(int filedes);
return : 0 / -1
read 시스템 호출
- open된 파일로부터 지정한 byte수 만큼 data를 읽어 저장장소에 저장하는 명령
- file pointer or read-write pointer : 읽혀질 다음 바이트의 위치를 나타냄
ssize_t read(int filedes, void *buffer, size_t nbytes);
return : 실제 읽힌 byte 수 / -1
→ return 값 < nbytes : file에 남은 데이터가 nbytes보다 적은 경우.
→ 그 다음은 더 이상 읽을게 없으면, return 값은 0
- 인수 사용법
- filedes : open된 파일 디스크립터
- *buffer : 읽을 데이터를 저장할 곳의 주소. 데이터 타입을 상관 X
- nbytes : 읽을 바이트 수; 데이터 타입에 상관 없이 지정된 데이터 바이트 수 만큼 읽음
write 시스템 호출
- 지정된 저장장소에서 지정한 바이트수 만큼의 데이터를 읽어 open된 파일에 쓰는 명령어
- file pointer or read-write pointer : 읽혀질 다음 바이트의 위치를 나타냄
ssize_t write(int filedes, const void *buffer, size_t nbytes);
return : 쓰여진 바이트 수 / -1
→ 보통은 return값 = nbytes
→ return 값이 n보다 작은 경우는 도중에 파일이 꽉찬 경우임.
→ 만약, 쓰기 전에 꽉 차면 -1 return
- 인수 사용법
- filedes : write할 파일 디스크립터
- *buffer : write할 내용이 들어 있는 저장 장소의 주소
- nbytes : write할 바이트의 수
- 주의할 점
- 기존 파일을 open하고 write를 하는 경우에는 덮어쓰게됨. 따라서 덮어쓰는게 싫다면 open할 때 “O_APPEND”를 사용해야함.
read/write의 효율성
- 파일을 카피하는 프로그램의 실행시간
- 버퍼사이즈가 512일때 가장 효율적임
- 시스템 콜의 수가 적을 수록 효율적임
lseek와 임의 접근
- open된 파일 내의 특정 위치로 파일 포인터를 이동시키는 시스템콜
off_t lseek(int filedes, off_t offset, int whence);
return : 이동된 위치(시작점부터의 위치) / -1
- 인수 사용법
- filedes
- whence : whence에서 offset만큼 떨어진 위치로 이동
- SEEK_SET : 시작 지점
- SEEK_CUR : 현재 파일 위치
- SEEK_END : 파일 끝 지점
- offset : whence에서 오프셋만큼 떨어진 위치로 이동 (+/-로 설정 가능)
file의 제거
- file을 삭제하는 명령
int unlink(const char *filename);
int remove(const char *filename);
'programming > Unix' 카테고리의 다른 글
[Unix Programming] 6. 프로세스 정보 (1) | 2024.12.11 |
---|---|
[Unix Programming] 5. 시스템 정보 (0) | 2024.12.11 |
[Unix Programming] 3. 파일 다루기 (0) | 2024.12.09 |
[Unix Programming] 2. 디렉터리 다루기 (0) | 2024.12.09 |
[Unix Programming] 개요 (0) | 2024.12.09 |