Linux 명령 열기 배우기

개요

#include "A HREF ="file : /usr/include/sys/types.h "> sys / types.h> #include"A HREF = "file : /usr/include/sys/stat.h"> sys / stat.h> #include "A HREF ="file : /usr/include/fcntl.h "> 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 () 시스템 호출 linux 명령 은 경로명을 파일 기술자 ( 읽기 , 쓰기 등과 같이 후속 입출력에서 사용하기위한 작고 음이 아닌 정수)로 변환하는 데 사용됩니다. 호출이 성공하면, 파일 디스크립터는 프로세스를 위해 현재 열지 않은 가장 낮은 파일 디스크립터가된다. 이 호출은 다른 프로세스와 공유되지 않는 새로운 열린 파일을 작성합니다. (하지만 공유 된 열린 파일은 fork (2) 시스템 호출을 통해 발생할 수 있습니다.) 새로운 파일 디스크립터는 exec 함수를 통해 열린 채로 유지됩니다 ( fcntl (2) 참조). 파일 오프셋은 파일의 시작 부분으로 설정됩니다.

매개 변수 플래그 는 파일을 읽기 전용으로, 쓰기 전용으로 또는 읽기 / 쓰기를 각각 bitwise- 또는 'd'로 열거 요청하는 O_RDONLY , O_WRONLY 또는 O_RDWR 중 하나입니다.

O_CREAT

파일이 존재하지 않으면 생성됩니다. 파일의 소유자 (사용자 ID)는 프로세스의 유효 사용자 ID로 설정됩니다. 그룹 소유권 (그룹 ID)은 프로세스의 유효 그룹 ID 또는 상위 디렉토리의 그룹 ID로 설정됩니다 (파일 시스템 유형 및 마운트 옵션 및 상위 디렉토리의 모드에 따라 다름). 예를 들어 마운트 ext2 파일 시스템의 옵션 bsdgroupssysvgroups ( mount (8)에 설명되어 있음).

O_EXCL

O_CREAT 와 함께 사용하면 파일이 이미 존재하면 오류이므로 열기 가 실패합니다. 이 문맥에서, 그것의 가리키는 곳과 관계없이 심볼릭 링크가 존재한다. NFS 파일 시스템 에서 O_EXCL 이 깨지면 잠금 작업 수행을 위해 의존하는 프로그램에 경쟁 조건이 포함됩니다. lockfile을 사용하여 원자 파일 잠금을 수행하는 솔루션은 동일한 fs (예 : hostname 및 pid 통합)에 고유 파일을 작성하고 link (2)를 사용하여 lockfile에 대한 링크를 작성하는 것입니다. link () 가 0을 반환하면 잠금이 성공한 것입니다. 그렇지 않으면 고유 한 파일에 대해 stat (2)를 사용하여 링크 수가 2로 증가했는지 확인하십시오.이 경우 잠금도 성공적입니다.

O_NOCTTY

pathname 이 터미널 장치를 참조한다면 --- tty (4)를보십시오 --- 프로세스가 터미널을 가지고 있지 않더라도 프로세스의 제어 터미널이되지는 않을 것입니다.

O_TRUNC

파일이 이미 존재하고 일반 파일이고 열린 모드가 쓰기를 허용하면 (즉, O_RDWR 또는 O_WRONLY) 길이가 0으로 잘립니다. 파일이 FIFO 또는 터미널 장치 파일 인 경우 O_TRUNC 플래그는 무시됩니다. 그렇지 않으면 O_TRUNC의 효과가 지정되지 않습니다. (많은 리눅스 버전 에서는 무시 될 것이고 다른 버전에서는 에러를 리턴 할 것입니다.)

O_APPEND

파일이 추가 모드로 열립니다. 각 쓰기 전에 파일 포인터는 lseek 와 마찬가지로 파일의 끝에 위치합니다. 둘 이상의 프로세스가 한 번에 파일에 데이터를 추가하면 O_APPEND 는 NFS 파일 시스템에서 손상된 파일로 이어질 수 있습니다. 이는 NFS가 파일에 추가를 지원하지 않기 때문에 클라이언트 커널이이를 시뮬레이션해야하기 때문에 경쟁 조건 없이는 수행 할 수 없습니다.

O_NONBLOCK 또는 O_NDELAY

가능한 경우 파일이 비 차단 모드로 열립니다. 리턴 된 파일 디스크립터에 대한 열기 또는 후속 조작은 ​​호출 프로세스를 대기 상태로 만듭니다. FIFO (named pipes)의 처리에 대해서는 fifo (4)를 참조하십시오. 이 모드는 FIFO가 아닌 다른 파일에 영향을 줄 필요가 없습니다.

O_SYNC

동기 I / O를 위해 파일이 열립니다. 결과 파일 디스크립터에 대한 모든 쓰기 는 데이터가 물리적으로 기본 하드웨어에 기록 될 때까지 호출 프로세스를 차단합니다. 아래 제한 사항을 참조하십시오.

O_NOFOLLOW

pathname 이 기호 링크 인 경우 열기가 실패합니다. 이것은 2.1.126 버전의 Linux에 추가 된 FreeBSD 확장입니다. 경로 이름의 이전 구성 요소에있는 기호 링크는 계속됩니다. glibc 2.0.100 이후의 헤더에는이 플래그의 정의가 포함됩니다. 2.1.126 이전의 커널은 사용 된 경우이를 무시합니다 .

O_DIRECTORY

pathname 이 디렉토리가 아닌 경우 open을 실패하게 만듭니다. 이 플래그는 리눅스에서만 사용 가능하며, opendir (3)이 FIFO 나 테이프 장치에서 호출되었을 때 서비스 거부 문제를 피하기 위해 커널 버전 2.1.126에 추가되었지만 opendir 구현 외부에서 사용해서는 안됩니다 .

O_DIRECT

이 파일과의 I / O의 캐시 효과를 최소화하십시오. 일반적으로 이것은 성능을 저하 시키지만 응용 프로그램이 자체 캐싱을 수행하는 경우와 같은 특별한 상황에서 유용합니다. 파일 I / O 는 사용자 공간 버퍼에서 직접 수행됩니다. I / O는 동기식입니다. 즉, read (2) 또는 write (2) 시스템 호출이 완료되면 데이터가 전송 된 것입니다. 전송 크기 및 사용자 버퍼와 파일 오프셋의 정렬은 모두 파일 시스템의 논리 블록 크기의 배수 여야합니다.
이 플래그는 여러 유닉스 계열 시스템에서 지원됩니다. 커널 버전 2.4.10의 Linux에서 지원이 추가되었습니다.
블록 장치에 대한 의미 론적으로 비슷한 인터페이스는 raw (8)에 설명되어 있습니다.

O_ASYNC

이 파일 디스크립터에서 입출력이 가능 해지면 신호 (기본적으로 SIGIO이지만 fcntl (2)를 통해 변경할 수 있음)를 생성하십시오. 이 기능은 터미널, 유사 터미널 및 소켓에서만 사용할 수 있습니다. 자세한 내용은 fcntl (2)를 참조하십시오.

O_LARGEFILE

대용량 파일 시스템을 지원하는 32 비트 시스템에서 크기를 31 비트로 표현할 수없는 파일을 열 수 있습니다.

이러한 선택적 플래그 중 일부는 파일이 열린 후에 fcntl 을 사용하여 변경할 수 있습니다.

인수 모드 는 새 파일이 작성 될 때 사용할 권한을 지정합니다. 프로세스의 umask 에 의해 일반적인 방법으로 수정됩니다. 생성 된 파일의 권한은 (mode & ~ umask) 입니다. 이 모드는 새로 생성 된 파일의 향후 액세스에만 적용됩니다. 읽기 전용 파일을 만드는 open 호출은 읽기 / 쓰기 파일 기술자를 반환 할 수 있습니다.

모드 에는 다음과 같은 기호 상수가 제공 됩니다 .

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플래그 에있을 때 모드 를 지정해야하며, 그렇지 않으면 무시됩니다.

creatO_CREAT | O_WRONLY | O_TRUNC 와 같은 플래그를 가진 open 과 동일합니다.

반환 값

opencreat 은 새로운 파일 디스크립터를 리턴한다. 에러가 발생하면 -1을 리턴한다 (이 경우 errno 가 적절하게 설정된다). open 은 장치 특수 파일을 수 있지만 creat 은 장치 특수 파일을 만들 수 없습니다. 대신 mknod (2)를 사용하십시오.

UID 매핑을 사용하는 NFS 파일 시스템에서 open 은 파일 디스크립터를 반환 할 수 있지만 예를 들어 read (2) 요청은 EACCES 로 거부됩니다. 이는 클라이언트가 사용 권한을 확인하여 열기 를 수행하지만 읽기 및 쓰기 요청시 UID 맵핑이 서버에 의해 수행되기 때문입니다.

파일이 새로 작성되면 atime, ctime, mtime 필드는 현재 시간으로 설정되고 상위 디렉토리의 ctime 및 mtime 필드도 설정됩니다. 그렇지 않으면 O_TRUNC 플래그로 인해 파일이 수정되면 ctime 및 mtime 필드가 현재 시간으로 설정됩니다.

오류

EEXIST

pathname이 이미 존재하고 O_CREATO_EXCL 이 사용되었습니다.

아이 디스

pathname 은 디렉토리를 의미하고 요청 된 액세스는 관련된 쓰기 (즉, O_WRONLY 또는 O_RDWR 이 설정 됨)입니다.

EACCES

요청 된 파일 액세스가 허용되지 않았거나 pathname 의 디렉토리 중 하나가 검색 (실행) 권한을 허용하지 않았거나 파일이 아직 존재하지 않고 상위 디렉토리에 대한 쓰기 권한이 허용되지 않습니다.

ENAMETOOLONG

경로 이름 이 너무 깁니다.

ENOENT

O_CREAT가 설정되지 않았고 명명 된 파일이 존재하지 않습니다. 또는 pathname 의 디렉토리 구성 요소가 없거나 매달린 기호 링크입니다.

ENOTDIR

pathname에 디렉토리로 사용되는 구성 요소가 실제로 디렉토리가 아니거나 O_DIRECTORY 가 지정되었고 pathname 이 디렉토리가 아닙니다.

ENXIO

O_NONBLOCK | O_WRONLY가 설정되고, 명명 된 파일은 FIFO이며 읽기를 위해 파일을 열지 않은 프로세스가 없습니다. 또는 파일이 장치 특수 파일이고 해당 장치가 없습니다.

ENODEV

pathname 은 장치 특수 파일을 나타내며 해당 장치가 없습니다. (이것은 Linux 커널 버그입니다.이 상황에서는 ENXIO가 반환되어야합니다.)

EROFS

pathname 은 읽기 전용 파일 시스템의 파일을 참조하고 쓰기 액세스가 요청되었습니다.

ETXTBSY

pathname 은 현재 실행되고 있고 쓰기 권한이 요청 된 실행 가능 이미지를 나타냅니다.

EFAULT

pathname 은 액세스 가능한 주소 공간을 가리 킵니다.

ELOOP

pathname 을 해석 할 때 너무 많은 심볼릭 링크가 발견되었거나 O_NOFOLLOW 가 지정되었지만 pathname 이 기호 링크였습니다.

ENOSPC

pathname 이 생성되었지만 pathname 을 포함하는 장치에 새 파일을위한 공간이 없습니다.

ENOMEM

불충분 한 커널 메모리를 사용할 수있었습니다.

EMFILE

프로세스에 이미 최대 수의 파일이 열려 있습니다.

ENFILE

시스템에서 열린 파일의 총 수에 대한 한계에 도달했습니다.

준수

SVr4, SVID, POSIX, X / OPEN, BSD 4.3 O_NOFOLLOWO_DIRECTORY 플래그는 Linux에 따라 다릅니다 . 정의를 얻기 위해 _GNU_SOURCE 매크로를 정의해야 할 수도 있습니다.

제한 사항

O_SYNCO_NDELAY 사이에 영향을 미치는 NFS의 기본 프로토콜에는 많은 정보가 있습니다.

POSIX는 플래그 O_SYNC , O_DSYNCO_RSYNC에 해당하는 동기화 된 I / O의 세 가지 변형을 제공 합니다. 현재 (2.1.130) 이들은 모두 Linux에서 동의어입니다.