OPEN(2)

이름
open, creat - 파일이나 장치를 열고 생성한다.

사용법
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
int creat(const char *pathname, mode_t mode);

설명
open() 시스템 호출은 파일 디스크립터에서 경로명 전환에 사용된다. 호출이 성공하면, 반환되는 파일 디스크립터는 프로세스를 위해 열리지 않는다. 이 호출은 모든 다른 프로세스가 공유하지 않는 새로운 파일을 생성한다. flags 는 파일을 read-only, write-only, read/write로 여는 요청을 하는 O_RDONLY, O_WRONLY or O_RDWR 중 하나이다. flags 는 또한 다음중 하나이상을 가진 bitwise-or'd 일런지 모른다:

O_CREAT
    파일이 없으면 생성될것이다.

O_EXCL
    When used with O_CREAT 를 사용할 때, 파일이 이미 존재한다면 에러나 파일을 여는데 실패할 것이다. O_EXCL 는 NFS 파일 시스템을 깬다. 잠금파일을 사용하는 automic파일 잠금을 실행하기위한 솔루션은 같은 파일 시스템에 특정파일을 생성하기 위함이다.

O_NOCTTY
    경로명 이 터미널 장치를 언급한다면 tty(4) 를 본다.

O_TRUNC
    파일이 이미 존재한다면 그것은 생략될 것이다.

O_APPEND
    파일이 추가모드에 열려있다. 각각 기록 되기 전에 파일포인터는 lseek 가 있는 것처럼 파일의 끝에 위치한다. O_APPEND 는 적어도 하나 이상의 프로세스가 파일에 데이타를 추가한다면 NFS파일 시스템상에 변질(correpted)된 파일을 이끈다. 이것은 NFS가 파일에 추가를 지원하지 않기때문이다. 그래서 클라이언트 커널은 그것을 시뮬레이트한다.

O_NONBLOCK or O_NDELAY
    파일은 비블록 모드로 열린다.

O_SYNC
    파일은 입출력 동기화를 위해 열린다. 파일 디스크립터 결과 모든 writes 는 데이타가 물리적으로 하드웨어로 기록될 때까지 호출 프로세스를 블록화 할 것이다. 아래의 RESTRICTIONS를 본다.

O_NOFOLLOW
    경로명이 심볼릭 링크라면, 파일열기는 실패한다. 이것은 리눅스 버전 2.1.126에 추가된 freeBSD확장이다. 경로명의 초기 구성인 심볼릭 링크는 계속 따를것이다. glibc2.0.100의 헤더와 후에 이 플래그의 정의를 포함한다; 커널 2.1.126이전에서 사용한다면 무시할 것이다.

O_DIRECTORY
    경로명이 디렉토리가 아니라면, 파일열기는 실패할 것이다. 이 플래그는 리눅스의 특징이고, opendir(3)가 FIFO나 테입장치에 호출된다면 서비스의 거부문제를 피하기 위해 리눅스 커널 버전 2.1.126에 추가되었다. 그러나 opendir는 외부에서 사용될 수 없다.

O_LARGEFILE
    대용량 파일 시스템을 지원하는 32비트 시스템은 31비트로는 열수 없는 크기의 파일을 사용할 수 있다. 리눅스 커널은 이것을 아직은 지원하지 못하지만, glibc 2.1에서 테스팅되었다.

몇몇 이러한 옵션 플래그는 파일이 열린후 사용하는 fcntl 가 바뀔 수 있다. 모드 는 새로운 파일이 생성되면 사용권한을 지정한다. 대개 프로세스의 umask 로 수정한다: 생성된 파일의 권한은 (mode & ~umask) 이다.

다음의 심볼릭 상수는 모드 를 위해 제공된다:

S_IRWXU
    00700 사용자(파일 소유자)는 읽기, 쓰기, 실행권한이 있다.

S_IRUSR (S_IREAD)
    00400 사용자는 읽기 권한이 있다.

S_IWUSR (S_IWRITE)
    00200 사용자는 쓰기 권한이 있다.

S_IXUSR (S_IEXEC)
    00100 사용자는 실행 권한이 있다.

S_IRWXG
    00070 그룹은 읽기, 쓰기, 실행 권한이 있다.

S_IRGRP
    00040 그룹은 읽기 권한이 있다.

S_IWGRP
    00020 그룹은 쓰기 권한이 있다.

S_IXGRP
    00010 그룹은 실행 권한이 있다.

S_IRWXO
    00007 기타사용자는 읽기, 쓰기, 실행 권한이 있다.

S_IROTH
    00004 기타사용자는 읽기 권한이 있다.

S_IWOTH
    00002 기타사용자는 쓰기 권한이 있다.

S_IXOTH
    00001 기타사용자는 실행 권한이 있다. 모드 는 항상 O_CREAT 가 플래그 일때 지정되어야만하고, 그밖에는 무시한다. 생성 은 O_CREAT|O_WRONLY|O_TRUNC 와 일치하는 플래그 를 가진 파일열기 와 일치한다.

반환값
열기와생성 은 에러가 나면 새로운 파일 디스크립터를 반환하거나 -1을 반환한다. 이런경우 errno 는 적절히 설정된다. Note that 열기 는 장치파일을 열순 있지만, 생성 은 장치파일을 생성 할 수 없는 것을 주지한다. 대신 mknod(2) 을 사용한다.

UID 맵핑이 가능한 NFS 파일 시스템에서 열기는 파일 디스크립터를 반환하지만, read(2)는 거부된다. 이것은 클라이언트가 권한검사에 의해 열기를 실행하지만 UID 맵핑은 서버에 의해 실행할 수 있기 때문이다.

에러

EEXIST
    경로명 이 이미 존재하고, O_CREAT and O_EXCL 가 사용된다.

EISDIR
    경로명 이 디렉토리를 참조하고, 접근은 복잡한 기록을 요구했다.

EACCES
    요청한 파일 접근은 거부되거나 경로명 의 디렉토리중 하나가 실행권한을 찾을 수 없거나 파일이 아직 존재하지 않고 부모디렉토리 접근이 거 부됐다.

ENAMETOOLONG
    경로명이너무길다.

ENOENT
    A directory component in 경로명 의 디렉토리가 없거나 심볼릭 링크가 깨졌다.

ENOTDIR
    A component used as a directory in 경로명 에 디렉토리로써 사용되는 것이 없다. 사실 디렉토리나 O_DIRECTORY가 지정되었고 경로명 이 디렉토리가 아니다.

ENXIO
    O_NONBLOCK | O_WRONLY가 설정되고, 지정한 파일이 FIFO이고 어떠한 프로세스도 읽기위해 열린 파일이 없다. 또는, 파일이 장치파일이고 일치하는 장치가 없다.

ENODEV
    경로명 이 장치파일을 참조하고, 일치하는 장치가 없다.

EROFS
    경로명 이 read-only 파일시스템의 파일을 참조하고 쓰기접근이 요청됐다.

ETXTBSY
    경로명 이 현재 실행중인 실행이미지파일을 참조하고 쓰기권한 접근이 요청되었다.

EFAULT
    경로명이당신이접근할수있는주소공간밖을가리킨다.

ELOOP
    심볼릭링크가 너무 많다. 경로명 이나 O_NOFOLLOW가 지정되었지만 경로명 이 심볼릭 링크이다.

ENOSPC
    경로명 이 생성되었지만 장치가 경로명 이 포함하는 장치가 새로운 파일을 위한 공간이 없다.

ENOMEM
    커널 메모리가 부족하다.

EMFILE
    프로세스가 이미 파일열기의 최대값에 찼다.

ENFILE
    파일열기의 총합제한에 도달했다.

호환
SVr4, SVID, POSIX, X/OPEN, BSD 4.3

제한
POSIX은 O_SYNC, O_DSYNC 와 O_RSYNC에 일치하는 입출력 동기화의 세가지 다른 변수를 제공한다. 현재(2.1.130) 이런것들은 리눅스에서 모두 같은 뜻이다.

관련 항목
read(2), write(2), fcntl(2), close(2), link(2), mknod(2), mount(2), stat(2), umask(2), unlink(2), socket(2), fopen(3), fifo(4)

역자
ASPLINUX<man@asp-linux.co.kr>, 2000년 7월 29