OPEN(2)

명칭
open - 읽기 또는 기록용으로 파일을 오픈한다, 또는 작성한다

프로그램 라이브러리
libc

서식
<fcntl.h> int open(const char *path, int flags, ...)

해설
path 에 의해 지정되는 파일을, 인수 flags 에 의해 지정된 것처럼 읽기 또는 기록 (또는 그 양쪽 모두)용으로 오픈해, 그 파일 기술자를 호출해 원프로세스에 돌려줍니다. 파일이 존재하지 않는 경우에는 파일을 작성하도록(듯이), flags 인수로 지시할 수 있습니다 (O_CREAT 플래그를 지정한다). 이 경우, open 에는 3 번째의 인수 mode_t mode 하지만 필요하고, 파일은 chmod(2) 그리고 설명되고 있도록(듯이) 모드 mode 그리고 작성되어 프로세스의 umask 치에 의해 수정됩니다 (umask(2) (을)를 참조).

지정된 플래그는 다음의 값의 논리합 (or) 그리고 작성됩니다.

    O_RDONLY	읽기 전용으로 오픈
    O_WRONLY	기록 전용으로 오픈
    O_RDWR		읽기와 기록용으로 오픈
    O_NONBLOCK	오픈할 경우에 블록 하지 않는다
    O_APPEND	기록마다 말미에 추가한다
    O_CREAT		파일이 존재하지 않는 경우, 작성한다
    O_TRUNC		사이즈를 0 에 잘라 버린다
    O_EXCL		작성하는 파일이 이미 존재했을 경우, 에러로 한다
    O_SHLOCK	공유 락을 자동적으로 취득한다
    O_EXLOCK	배타적 락을 자동적으로 취득한다
    O_DIRECT	캐쉬의 효과를 잃는 또는 줄인다
    O_FSYNC		동기적으로 기입한다
    O_NOFOLLOW	기호 연결을 더듬지 않는다

O_APPEND (을)를 설정해 파일을 오픈하면(자), 파일에의 기록은 모두 파일의 말미에 추가됩니다. O_TRUNC 하지만 지정되어 있어 파일이 존재하는 경우, 파일은 길이 0 에 잘라 버릴 수 있습니다. O_EXCL 하지만 O_CREAT (와)과 함께 설정되어 있어 파일이 이미 존재하는 경우, open() (은)는 에러를 돌려줍니다. 이것을 사용해, 간단한 배타적 아크세스록킹메카니즘을 실현될 수 있습니다. O_EXCL 하지만 설정되어 있어 패스명의 마지막 원가요소가 기호 연결의 경우, 비록 기호 연결이 존재하지 않는 이름을 가리키고 있었다고 해도 open() (은)는 처리에 실패합니다. O_NONBLOCK 플래그가 지정되어 있어 open() 호출의 결과, 프로세스가 어떠한 이유로 블록 되면(자) (예를 들어, 다이얼 업 회선으로 캐리어를 기다리고 있는 경우), open() (은)는 즉석에서 돌아옵니다. 프로세스가 오픈한 파일에 최초로 입출력하려고 했을 때, 프로세스는 블록 합니다 (현시점에서는 실장되고 있지 않습니다).

O_FSYNC 하지만 마스크에 사용되었을 경우, 모든 기입은 즉시 디스크에 기입해져 커널은 기입해진 데이터를 캐쉬하지 않고, 기입해야 한다 모든 데이터가 완료할 때까지는 이 기술자에 대한 모든 기입은 돌아오지 않습니다.

O_NOFOLLOW 하지만 마스크에 사용되었을 경우로 open() 에게 건네진 대상 파일이 기호 연결의 경우, open() (은)는 실패합니다.

파일을 오픈할 경우에, flock(2) (을)를 사용한 락을 얻으려면 , 공유 락에 대해서는 O_SHLOCK, 배타적 락에 대해서는 O_EXLOCK (을)를 설정합니다. O_CREAT 그리고 파일을 작성하는 경우, 락 요구가 실패하는 것 (은)는 없습니다 (다만, 하층에 있는 파일 시스템이 락을 서포트하고 있는 경우에 한정합니다).

읽고 쓰기에 있어서의 캐쉬의 효과를 최소화 혹은 잃기 위해서(때문에) O_DIRECT (을)를 사용 가능합니다. 시스템은, 읽고 쓰기하는 데이터의 캐싱을 피하려고 합니다. 데이터의 캐싱을 피할 수 없는 경우, 데이터의 캐쉬에 대한 영향을 최소화합니다. 주의하지 않고 사용하면(자), 본플래그는 극적으로 성능을 열화 시킵니다.

정상적으로 완료하면(자), open() (은)는, 파일 기술자를 나타내는 부가 아닌 정수를 돌려줍니다. 처리에 실패하면(자) -1 를 돌려줍니다. 파일내의 현재의 위치를 마크 한다 파일 포인터는 파일의 선두로 설정됩니다.

새로운 파일이 작성되는 경우, 그 그룹은 파일이 포함되는 디렉토리의 그룹으로 설정됩니다.

새로운 기술자는 execve(2) 시스템 콜을 통해서 오픈된채로 있도록(듯이) 설정됩니다. close(2) (와)과 fcntl(2) (을)를 참조해 주세요.

시스템에는, 1 개의 프로세스에 의해 동시에 오픈할 수 있다 파일 기술자수에 제한이 있습니다. getdtablesize(2) (은)는 현재의 시스템 제한을 돌려줍니다.

반환값
정상적으로 완료하면(자), open() (은)는 파일 기술자인 부가 아닌 정수를 돌려줍니다. 처리에 실패하면(자) -1 가 돌려주어져 에러를 나타내기 위해서(때문에) errno 하지만 설정됩니다.

에러
지정의 파일은 다음의 경우를 제외해 오픈됩니다.

[ENOTDIR]
    패스의 원가요소중에 디렉토리 이외의 것이 포함되어 있습니다.

[ENAMETOOLONG]
    패스명의 원가요소가 255 캐릭터를 넘고 있는지, 또는 패스명 전체가 1023 캐릭터를 넘고 있습니다.

[ENOENT]
    지정된 파일이 존재하지 않고, O_CREAT 도 설정되어 있지 않습니다.

[ENOENT]
    존재해야 하는 패스명의 원가요소가 존재하지 않습니다.

[EACCES]
    지정된 패스에는, 검색이 허가되어 있지 않은 디렉토리가 포함되어 있습니다.

[EACCES]
    요구된 퍼미션 (읽기 또는 기록용, 또는 양쪽 모두)이 지정의 플래그에 거부되고 있습니다.

[EACCES]
    O_CREAT 하지만 지정되어 있어, 파일이 존재하지 않고, 한편 파일을 작성한다 디렉토리에 기록 허가가 없습니다.

[ELOOP]
    패스명을 변환할 경우에 검출된 기호 연결이 너무 많습니다.

[EISDIR]
    지정의 파일이 디렉토리이며, 이것을 기록용으로 오픈하도록(듯이) 인수가 지정되어 있습니다.

[EROFS]
    지정된 파일은 읽기 전용 파일 시스템상에 있어, 그 파일을 수정하려고 하고 있습니다.

[EMFILE]
    프로세스는, 벌써 오픈할 수 있는 파일 기술자에 관한 제한에 이르고 있습니다.

[ENFILE]
    시스템 파일 테이블이 만배입니다.

[EMLINK]
    O_NOFOLLOW 하지만 지정되어 대상이 기호 연결입니다.

[ENXIO]
    지정의 파일은 캐릭터형 특수 파일 또는 블록형 특수 파일이며, 이 특수 파일에 연결시킬 수 있었던 디바이스는 존재하고 있지 않습니다.

[ENXIO]
    지정된 파일은 FIFO 파이프로, 어느 프로세스로부터도 읽기용으로 오픈되어 있지 않은에도 관계하지 않고, 이것을 기록용으로 오픈하려고 했습니다.

[EINTR]
    open() 조작이 시그널에 의해 끼어들어 되었습니다.

[EOPNOTSUPP]
    O_SHLOCK 또는 O_EXLOCK 하지만 지정되었습니다만, 하층이 되고 있는 파일 시스템은 락을 서포트하고 있지 않습니다.

[EWOULDBLOCK]
    O_NONBLOCK 라고 O_SHLOCK 인가 O_EXLOCK 의 어느 쪽인지가 지정되었습니다만, 파일은 락 되고 있습니다.

[ENOSPC]
    O_CREAT 하지만 지정되어 있어, 파일이 존재하지 않고, 새로운 파일용의 엔트리를 배치중의 디렉토리는, 그 디렉토리를 포함한 파일 시스템에 공간이 남지 않기 때문에 확장할 수 없습니다.

[ENOSPC]
    O_CREAT 하지만 지정되어 있어, 파일이 존재하지 않고, 한편 파일이 작성중의 파일 시스템상에 미사용의 inode 가 없습니다.

[EDQUOT]
    O_CREAT 하지만 지정되어 있어, 파일이 존재하지 않고, 한편 새로운 파일용의 엔트리를 배치중의 디렉토리는, 그 디렉토리를 포함한다 파일 시스템상에서 디스크 블록의 유저의 쿼터가 고갈했기 때문에 확장할 수 없습니다.

[EDQUOT]
    O_CREAT 하지만 지정되어 있어, 파일이 존재하지 않고, 한편 파일을 작성중의 파일 시스템상에서 inode 의 유저의 쿼터가 고갈하고 있습니다.

[EIO]
    디렉토리 엔트리를 작성중, 또는 O_CREAT 용무의 inode 를 할당중에 입출력 에러가 발생했습니다.

[ETXTBSY]
    파일은 순수한 수속 (공유 텍스트) 파일로, open() 하지만 기록 액세스를 요구했습니다만, 파일은 실행중입니다.

[EFAULT]
    path (은)는, 프로세스에 할당할 수 있었던 address 공간의 범위외를 가리키고 있습니다.

[EEXIST]
    O_CREAT (와)과 O_EXCL 하지만 지정되어 있어, 파일이 존재합니다.

[EOPNOTSUPP]
    소켓을 오픈하려고 했습니다 (현시점에서는 실장되고 있지 않습니다).

[EINVAL]
    O_RDONLY, O_WRONLY 및 O_RDWR 의 부정한 조합으로 기술자를 오픈하려고 했습니다.

관련 항목
chmod(2), close(2), dup(2), getdtablesize(2), lseek(2), read(2), umask(2), write(2)

역사
open() 함수는 AT&T UNIX 그리고 등장했습니다.