APUE 학습 기록 20200622 ~ 20200623

3.2 파일 설명자
커 널 의 경우 열 린 모든 파일 은 파일 설명자 로 참조 합 니 다.파일 설명 자 는 부정 정수 입 니 다.기 존 파일 을 열 거나 새 파일 을 만 들 때 커 널 은 프로 세 스 에 파일 설명 자 를 되 돌려 줍 니 다.파일 을 읽 고 쓸 때 open 이나 creat 가 돌아 오 는 파일 설명 자 를 사용 하여 read 와 write 에 매개 변수 로 전송 합 니 다.
UNIX 시스템 셸 은 프로 세 스 의 표준 입력 과 파일 설명자 0 을 연결 합 니 다. 파일 설명자 1 은 표준 출력 과 연결 되 고 파일 설명자 2 는 표준 오류 와 연 결 됩 니 다.POSIX. 1 에 맞 는 프로그램 에 서 는 0, 1, 2 를 기호 stdIN 로 바 꿔 야 합 니 다.FILENO、stdOUT_FILENO 와 stdERR필 레 노 는 가 독성 을 높 인 다.이 상수 들 은 헤더 파일 에서 정의 합 니 다.파일 설명자 의 변화 범 위 는 0 ~ OPEN 입 니 다.MAX-1.
3.3 함수 open 과 openat
open 또는 openat 함 수 를 호출 하면 파일 을 열거 나 만 들 수 있 습 니 다.
#include 
int open(const char *path, int pflag, .../*mode_t mode */);
int openat(int fd, const char *path, int oflag, ... /* mode_t mode */);

남 은 매개 변수의 수량 과 유형 이 가 변 적 임 을 나타 내 는 것open 함수 에 있어 서 새 파일 을 만 들 때 만 마지막 인 자 를 사용 합 니 다.
path 매개 변 수 는 파일 을 열거 나 만 들 이름 입 니 다.oflag 매개 변 수 는 이 함수 의 여러 옵션 을 설명 하 는 데 사용 할 수 있 으 며, 다음 하나 이상 의 상수 로 진행 하거나 연산 하여 oflag 매개 변 수 를 구성 할 수 있 습 니 다.
O_RDONLY 읽 기만 하고 O 열기WRONLY 는 O 열기 만 쓴다.EDWR 읽 기와 쓰기 열기 OEXEC 는 O 열기 만 수행 합 니 다.검색 만 하고 열기
이상 다섯 개의 상수 중 하 나 를 지정 하고 하나만 지정 해 야 합 니 다.
다음 상수 선택 가능: OAPPEND 추가 OCLOEX 가 FD 를...CLOEXEC 상수 파일 설명자 로고 O 로 설정CREAT 이 파일 이 존재 하지 않 으 면 생 성 합 니 다.open 함 수 는 mode 매개 변수 O 를 동시에 설명해 야 합 니 다.DIRECTORY path 참조 가 디 렉 터 리 가 아니라면 오류 가 발생 합 니 다.O_EXCL 이 O 를 동시에 지정 하면CREAT, 파일 이 이미 존재 하면 오류 가 발생 합 니 다.파일 이 존재 하 는 지 테스트 할 수 있 습 니 다. 존재 하지 않 으 면 이 파일 을 만 듭 니 다.이것 은 테스트 와 생 성 을 원자 조작 으로 만 들 었 다.O_NOCTTY path 가 터미널 장 치 를 인용 하면 이 장 치 를 이 프로 세 스 의 제어 단말기 로 할당 하지 않 습 니 다.O_NOFOLLOW path 가 심 볼 릭 링크 를 인용 하면 오류 가 발생 합 니 다.O_NONBLOCK path 가 FIFO, 특수 파일 또는 문자 특수 파일 을 참조 하면 이 옵션 은 파일 의 이번 열기 동작 과 후속 I/O 동작 을 비 차단 방식 으로 설정 합 니 다.O_SYNC 는 write 가 물리 적 I/O 작업 이 끝 날 때마다 이 write 작업 으로 인 한 파일 속성 업데이트 에 필요 한 I/O 를 포함 합 니 다.O_TRUNC 이 파일 이 존재 하고 쓰기 나 읽 기 전용 으로 열 리 면 길 이 를 0. O 로 자 릅 니 다.TTY_INIT 가 아직 열 리 지 않 은 터미널 장 치 를 열 면 표준 termios 파라미터 값 을 설정 합 니 다. 시 기 는 single UNIX Specification 에 부합 합 니 다.O_DSYNC 는 write 할 때마다 물리 적 I/O 작업 이 끝 날 때 까지 기 다 려 야 합 니 다. 그러나 이 쓰기 작업 이 방금 기 록 된 데 이 터 를 읽 는 데 영향 을 주지 않 는 다 면 파일 속성 이 업데이트 되 기 를 기다 릴 필요 가 없습니다.O_RSYNC 는 파일 설명 자 를 매개 변수 로 하 는 read 작업 을 모든 파일 의 같은 부분 에 걸 려 있 는 쓰기 작업 이 완 료 될 때 까지 기다 리 게 합 니 다.
open 과 openat 함수 에서 돌아 오 는 파일 설명 자 는 최소한 의 설명 자 를 사용 하지 않 은 수치 일 것 입 니 다.fd 매개 변수 open 과 openat 함수 구역 을 나 누 면 모두 3 가지 가능성 이 있 습 니 다.
  • path 매개 변 수 는 절대 경로 명 을 지정 합 니 다. 이 경우 fd 매개 변 수 는 무시 되 고 openat 함 수 는 open 함수 에 해당 합 니 다.
  • path 매개 변 수 는 상대 경로 명 을 지정 하고 fd 매개 변 수 는 상대 경로 명 이 파일 시스템 에서 의 시작 주 소 를 지적 했다.fd 인 자 는 상대 경로 이름 이 있 는 디 렉 터 리 케 이 를 열 어 가 져 옵 니 다.
  • path 매개 변 수 는 상대 경로 명 을 지정 하고 fd 매개 변 수 는 특수 값 AT 를 가지 고 있 습 니 다.FDCWD.이러한 상황 에서 경로 이름 은 현재 디 렉 터 리 에서 가 져 옵 니 다. openat 함 수 는 조작 상 open 함수 와 유사 합 니 다.

  • openat 함 수 는 POSIX. 1 최신 버 전에 추 가 된 함수 입 니 다.두 가지 문 제 를 해결 하 기 를 바 랍 니 다.
  • 스 레 드 는 디 렉 터 리 에 있 는 파일 을 상대 적 인 경로 이름 으로 열 수 있 고 이전 작업 디 렉 터 리 만 열 수 없습니다.
  • time - of - check - to - time - of - use (TOCTTOU) 오 류 를 피 할 수 있 습 니 다.

  • TOCTTOU 오류 의 기본 사상 은 파일 기반 함수 호출 이 두 개 있 으 면 두 번 째 호출 이 첫 번 째 호출 결과 에 의존 하면 프로그램 이 취약 하 다 는 것 이다.두 호출 은 원자 조작 이 아니 기 때문이다.
    만약 NAMEMAX 는 14 이 며, 보 기 는 현재 디 렉 터 리 에 15 자 를 포함 하 는 새 파일 을 만 듭 니 다.POSIX. 1 에서 상수POSIX_NO_TRUNC 는 너무 긴 파일 이름 이나 경로 이름 을 차단 할 지, 오 류 를 되 돌려 줄 지 결정 합 니 다.

    좋은 웹페이지 즐겨찾기