APUE - --- 파일 I/O

10114 단어
파일 설명자
커 널 의 경우 열 린 모든 파일 은 파일 설명자 로 참조 합 니 다.파일 설명 자 는 부정 정수 입 니 다.기 존 파일 을 열 거나 새 파일 을 만 들 때 커 널 은 프로 세 스 에 파일 설명 자 를 되 돌려 줍 니 다.
관례 에 따 르 면 UNIX 시스템 셸 은 파일 설명자 0 을 프로 세 스 의 표준 입력 과 연결 시 키 고 파일 설명자 1 은 표준 출력 과 연결 되 며 파일 설명자 2 는 표준 오류 와 연 결 됩 니 다.
POSIX. 1 에 맞 는 프로그램 에서 환수 0, 1, 2 는 표준화 되 었 지만 기호 상수 stdIN 로 교체 해 야 합 니 다.FILENO、stdOUT_FILENO 와 stdERRFILRNO 는 가 독성 을 높 인 다.이것들 은 항상 헤더 파일 에 있 습 니 다.
함수 open 과 openat
open 또는 openat 함 수 를 호출 하면 파일 을 열거 나 만 들 수 있 습 니 다.
#include <fcntl.h>
int open(const char *path, int oflag,.../*mode_t mode*/);
int openat(int fd, const char *path, int oflag, .../*mode_t mode*/);
//       :   ,       ;   ,  -1

path 매개 변 수 는 파일 을 열거 나 만 들 이름 입 니 다.oflag 인 자 는 이 함수 의 여러 옵션 (O RDONLY, O WRONLY, O RDWR, O CREAT 등) 을 설명 하 는 데 사용 할 수 있 습 니 다.
fd 매개 변 수 는 open 과 openat 함수 구역 을 나 누 어 모두 3 가지 가능성 이 있 습 니 다.1. path 매개 변 수 는 절대 경 로 를 지정 합 니 다. 이런 상황 에서 fd 매개 변 수 는 무시 되 고 openat 함 수 는 open 함수 에 해당 합 니 다.2. path 매개 변 수 는 상대 경로 이름 을 지정 하고 fd 매개 변 수 는 상대 경로 가 파일 시스템 에서 의 시작 주 소 를 지적 합 니 다.fd 인 자 는 상대 경로 이름 이 있 는 디 렉 터 리 를 열 어서 가 져 옵 니 다.3. path 매개 변 수 는 상대 경로 명 을 지정 하고 fd 매개 변 수 는 특수 값 AT 를 가지 고 있 습 니 다.FDCWD.이러한 상황 에서 경로 명 은 현재 작업 디 렉 터 리 에서 가 져 옵 니 다. openat 함 수 는 조작 상 open 함수 와 유사 합 니 다.
함수 creat
create 함수 로 새 파일 을 만 들 수도 있 습 니 다.
#include <fcntl.h>
int creat(const char *path, mode_t mode);
//   :   ,             ;   ,  -1

이 함 수 는 다음 과 같 습 니 다: open (path, O WRONLY | O CREAT | O TRUNC, mode);
함수 close
close 함 수 를 호출 하여 열 린 파일 을 닫 을 수 있 습 니 다.
#include <unistd.h>
int close(int fd);
//   :   ,  0;   ,  -1

파일 을 닫 을 때 이 프로 세 스 가 파일 에 추 가 된 모든 기록 자 물 쇠 를 풀 어 줍 니 다.프로 세 스 가 종 료 될 때 커 널 은 모든 열 린 파일 을 자동 으로 닫 습 니 다.많은 프로그램 들 이 이 기능 을 이용 하여 close 로 파일 을 닫 지 않 고 열 었 다.
함수 lseek
파일 을 열 때마다 연 결 된 '현재 파일 오프셋' (current file offset) 이 있 습 니 다.그것 은 보통 파일 시작 부분 에서 계산 하 는 바이트 수 를 측정 하 는 비 마이너스 정수 이다.일반적으로 읽 기, 쓰기 작업 은 현재 파일 의 편 이 량 에서 시작 하여 편 이 량 을 읽 고 쓴 바이트 수 를 증가 시킨다.시스템 의 기본 상황 에 따라 파일 을 열 때 O 를 지정 하지 않 는 한APPEND 옵션, 그렇지 않 으 면 이 오프셋 이 0 으로 설 정 됩 니 다.
lseek 를 호출 하여 파일 을 열 때 오프셋 을 설정 할 수 있 습 니 다.
#include <unistd.h>
off_t lssek(int fd, off_t offset, int whence);
//   :   ,         ;   ,  -1

매개 변수 offset 에 대한 설명 은 매개 변수 whence 의 값 과 관계 가 있 습 니 다.1. whence 가 SEEK 라면SET 는 이 파일 의 오프셋 을 파일 시작 부분 에서 offset 바이트 로 설정 합 니 다.2. whence 가 SEEK 라면CUR 은 이 파일 의 오프셋 을 현재 값 에 offset 으로 설정 합 니 다.3. whence 가 SEEK 라면END 는 이 파일 의 오프셋 을 파일 길이 에 offset 으로 설정 합 니 다.
파일 설명자 가 파이프, FIFO 또는 네트워크 소켓 을 가리 키 면 lseek 는 - 1 로 돌아 가 errno 를 ESPIPE 로 설정 합 니 다.
lseek 는 현재 파일 의 오프셋 만 커 널 에 기록 합 니 다. 어떠한 I/O 작업 도 일 으 키 지 않 습 니 다.그리고 이 오프셋 은 다음 읽 기 나 쓰기 에 사 용 됩 니 다.
함수 read
read 함 수 를 호출 하여 열 린 파일 에서 데 이 터 를 읽 습 니 다.
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t nbytes);
//   :      ,      ,  0;   ,  -1

실제 읽 어야 할 바이트 보다 적은 경우 가 많 습 니 다. 1. 일반 파일 을 읽 을 때 요구 바이트 까지 읽 기 전에 파일 끝 에 이 르 렀 습 니 다.2. 터미널 장치 에서 읽 을 때 보통 한 번 에 한 줄 을 읽 습 니 다.3. 파이프 나 FIFO 에서 읽 을 때 파이프 에 포 함 된 바이트 가 필요 한 수량 보다 적 으 면 read 는 실제 사용 가능 한 바이트 수 만 되 돌려 줍 니 다.4. 기록 을 위 한 장치 에서 읽 을 때 한 번 에 최대 한 개의 기록 을 되 돌려 줍 니 다.5. 신호 가 중단 되 고 일부 데 이 터 를 읽 었 을 때.
함수 write
write 함 수 를 호출 하여 파일 을 열 고 데 이 터 를 씁 니 다.
#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t nbytes);
//   :   ,        ;   ,  -1

그 반환 값 은 보통 인자 nbytes 의 값 과 같 습 니 다. 그렇지 않 으 면 오류 가 발생 합 니 다.write 오류 의 흔 한 원인 은 디스크 가 가득 쓰 여 있 거나 주어진 프로 세 스 의 파일 길이 제한 을 초과 한 것 입 니 다.
I/O 의 효율
대부분의 파일 시스템 은 성능 개선 을 위해 어떤 미리 읽 기 (read ahead) 기술 을 사용한다.순서대로 읽 고 있 는 것 이 감지 되면 시스템 은 응용 이 요구 하 는 것 보다 더 많은 데 이 터 를 읽 으 려 고 시도 하고 가상 응용 은 곧 이 데 이 터 를 읽 을 것 이다.
파일 공유
커 널 은 3 의 데이터 구 조 를 사용 하여 파일 을 여 는 것 을 표시 합 니 다. 그들 간 의 관 계 는 파일 공유 에 있어 서 하나의 프로 세 스 가 다른 프로 세 스에 미 칠 수 있 는 영향 을 결정 합 니 다.(1) 모든 프로 세 스 는 프로 세 스 표 에 기록 항목 이 있 습 니 다. 기록 항목 에는 파일 설명 표 가 포함 되 어 있 습 니 다. 벡터 로 볼 수 있 고 모든 설명 자 는 항목 을 차지 합 니 다.모든 파일 설명자 와 연 결 된 것 은 a. 파일 설명자 표지 입 니 다.b. 파일 시트 항목 을 가리 키 는 지침 입 니 다.(2) 커 널 은 모든 파일 을 열 수 있 도록 파일 시트 를 유지 합 니 다.모든 파일 테이블 항목 은 a. 파일 상태 플래그 를 포함 합 니 다.b. 현재 파일 오프셋.c. 이 파일 의 V 노드 테이블 항목 을 가리 키 는 지침 입 니 다.(3) 파일 을 열 때마다 V 노드 구조 가 있 습 니 다.V 노드 에는 파일 형식 과 이 파일 에 대해 다양한 조작 함 수 를 수행 하 는 지침 이 포함 되 어 있 습 니 다.대부분의 파일 에 대해 서 는 V 노드 에 이 파일 의 i 노드 도 포함 되 어 있 습 니 다.이 정 보 는 파일 을 열 때 디스크 에서 메모 리 를 읽 기 때문에 파일 의 모든 관련 정 보 는 언제든지 사용 할 수 있 습 니 다.
같은 파일 시트 항목 을 가리 키 는 파일 설명자 항목 이 많 을 수 있 습 니 다.fork 이후 에 도 같은 상황 이 발생 합 니 다. 이 때 부모 프로 세 스, 하위 프로 세 스 는 각각 파일 설명 자 를 열 어 같은 파일 표 항목 을 공유 합 니 다.
파일 설명자 표지 와 파일 상태 표 지 는 역할 범위 에서 의 차이 점 을 주의 하 십시오. 전 자 는 하나의 프로 세 스 의 설명자 에 만 사용 되 고 후 자 는 주어진 파일 표 항목 을 가리 키 는 모든 프로 세 스 의 설명자 에 적 용 됩 니 다.
모든 프로 세 스 가 같은 파일 을 읽 는 데 올 바 르 게 작 동 합 니 다.모든 프로 세 스 는 자신의 파일 시트 항목 을 가지 고 있 으 며, 현재 파일 의 오프셋 도 있 습 니 다.그러나 여러 프로 세 스 가 같은 파일 을 쓸 때 예상 치 못 한 결과 가 나 올 수 있 습 니 다.이런 상황 을 어떻게 피 하 는 지 설명 하기 위해 서 는 원자 조작의 개념 을 이해 해 야 한다.
원자 조작
(1) 파일 에 추가 (2) 함수 pread 와 pwrite
#include <unistd.h>
ssize_t pread(int fd, void *buf, size_t nbytes, off_t offset);
//   :      ,      ,  0;   ,  -1
ssize_t pwrite(int fd, const void *buf, size_t nbytes, off_t offset);
//   :   ,        ,   ,  -1

pread 를 호출 하 는 것 은 lseek 를 호출 한 후 read 를 호출 하 는 것 과 같 지만, pread 는 이러한 순서 로 호출 하 는 것 과 다음 과 같은 중요 한 차이 가 있 습 니 다.1. pread 를 호출 할 때 위치 추적 과 읽 기 동작 을 중단 할 수 없습니다.2. 현재 파일 의 오프셋 을 업데이트 하지 않 습 니 다.(3) 파일 만 들 기
일반적으로 원자 조작 (atomic operation) 은 여러 단계 로 구 성 된 조작 을 말한다.이 조작 이 원자 적 으로 실행 된다 면 모든 절 차 를 다 수행 하거나 한 걸음 도 실행 하지 않 거나 모든 절차 의 하위 집합 만 수행 할 수 없다.
함수 dup 와 dup 2
다음 두 함수 모두 기 존의 파일 설명 자 를 복사 하 는 데 사용 할 수 있 습 니 다.
#include <unistd.h>
int dup(int fd);
int dup2(int fd, int fd2)
//        :   ,         ;   ,  -1

dup 에서 돌아 온 새 파일 설명 자 는 현재 사용 가능 한 파일 설명자 의 최소 값 입 니 다.dup 2 에 대해 서 는 fd2 매개 변수 로 새 설명자 의 값 을 지정 할 수 있 습 니 다.fd2 가 열 렸 다 면 먼저 닫 습 니 다.fd 가 fd2 와 같 으 면 dup 2 는 fd2 로 돌아 가 닫 지 않 습 니 다.그렇지 않 으 면 fd2 의 FDCLOexEC 파일 설명자 로 고 는 fd2 가 프로 세 스 가 exec 를 호출 할 때 열 린 상태 임 을 잘 알 고 있 습 니 다.
함수 sync, fsync, fdatasync
#include <unistd.h>
int fsnyc(int fd);
int fdatasync(int fd);
//   :   ,  0;   ,  -1
void sync(void);

sync 는 수 정 된 모든 블록 버퍼 를 쓰기 대기 열 에 배열 한 다음 되 돌려 줍 니 다. 실제 쓰기 디스크 작업 이 끝 날 때 까지 기다 리 지 않 습 니 다.일반적으로 update 라 고 불 리 는 시스템 데 몬 은 주기 적 으로 sync 함 수 를 호출 합 니 다.이것 은 정기 적 으로 커 널 의 블록 버퍼 를 씻 는 것 을 보장 합 니 다.명령 sync (1) 도 sync 함 수 를 호출 합 니 다.fsync 함 수 는 파일 설명자 fd 가 지정 한 파일 에 만 작용 하고 쓰기 디스크 작업 이 끝 날 때 까지 기 다 렸 다가 돌아 갑 니 다.fsync 는 데이터베이스 와 같은 프로그램 에 사용 할 수 있 습 니 다. 이 프로그램 은 수 정 된 블록 이 디스크 에 즉시 기록 되 는 지 확인 해 야 합 니 다.fdatasync 함 수 는 fsync 와 유사 하지만 파일 의 데이터 부분 에 만 영향 을 줍 니 다.데이터 외 에 fsync 는 파일 의 속성 을 동시에 업데이트 합 니 다.
함수 fcntl
fcntl 함 수 는 열 린 파일 의 속성 을 변경 할 수 있 습 니 다.
#include <fcntl.h>
int fcntl(int fd, int cmd,.../*int arg*/);
//   :   ,    cmd;   ,  -1

fcntl 함 수 는 다음 과 같은 5 가지 기능 이 있 습 니 다. 1. 기 존 설명자 (cmd = F DUPFD 또는 F DUPFD CLOEXEC) 를 복사 합 니 다.2. 파일 설명자 로고 가 져 오기/설정 (cmd = F GETFD 또는 F SETFD).3. 파일 상태 표시 (cmd = F GETFL 또는 F SETFL) 를 가 져 오 거나 설정 합 니 다.4. 비동기 I/O 소유권 가 져 오기/설정 (cmd = F GETOWN 또는 F SETOWN).5. 기록 잠 금 가 져 오기/설정 (cmd = F GETLK, F SETLK 또는 F SETLKW).
함수 ioctl
ioctl 함 수 는 항상 I/O 작업 의 잡동사니 상자 입 니 다.이 장의 다른 함수 로 표시 할 수 없 는 I/O 작업 은 일반적으로 ioctl 로 표시 할 수 있다.터미널 I/O 는 ioctl 을 가장 많이 사용 하 는 곳 입 니 다.
#include <sys/IOCtl.h>
int ioctl(int fd, int request,...);
//   :   ,  -1;   ,     

/dev/fd
새로운 시스템 에 서 는/dev/fd 라 는 디 렉 터 리 를 제공 합 니 다. 디 렉 터 리 항목 은 0, 1, 2 등의 파일 입 니 다.파일/dev/fd/n 을 여 는 것 은 복사 설명자 n 과 같 습 니 다.

좋은 웹페이지 즐겨찾기