FCNTL(2)

이름
fcntl - 파일 기술자(file descriptor) 조작

사용법
#include <unistd.h>
#include <fcntl.h>

int fcntl(int fd, int cmd);
int fcntl(int fd, int cmd, long arg);
int fcntl(int fd, int cmd, struct flock * lock);

설명
fcntl fd에서 다양한 연산들 중 하나를 수행한다. 문제 중 연산은 cmd에 의해 결정된다:

F_DUPFD
    arg보다 크거나 동일한 가장 낮은 숫자가 지명된 사용가능한 파일 기술자를 찾고, 그것이 fd의 복사본이 되도록 하라. 이는 엄밀하게 지정된 기술자를 사용하는 dup2(2)와는 다르다.

    오래된 그리고 새로운 기술자들은 교대적으로 사용될 수 있다. 이들은 잠금(lock), 파일 위치 포인터 그리고 플래그를 공유한다. 예를 들면, 기술자들중 하나에서 파일 위치가 lseek를 사용해서 수정되면, 위치는 또한 다른 것에 대해 변경될 수 있다.

    두 기술자들은 close-on-exec 플래그를 공유하지 않는다. 그러나 복제본의 close-on-exec 플래그는 실행중에는 종료되지 않는 off 상태가 된다.

    성공하면, 새로운 기술자는 리턴된다.

F_GETFD
    close-on-exec를 읽는다. 만일 FD_CLOEXEC 비트가 0이면, 파일은 exec를 통해 열린 상태로 남겨지고, 그렇지 않으면, 닫힌다.

F_SETFD
    close-on-exec 플래그를 arg의 FD_CLOEXEC 비트에 의해 지정된 값으로 설정한다.

F_GETFL
    기술자의 플래그를 읽는다. (모든 플래그( open(2)에 의해 설정된)들은 리턴된다.)

F_SETFL
    arg 에 의해 지정된 값을 기술자의 플래그로 설정한다. 오직 O_APPEND, O_NONBLOCK 그리고 O_ASYNC 이 설정될 수 있다. 다른 플래그들은 영향을 받지 않는다.

    플래그들은 dup(2), fork(2) 로 만들어진 동일한 파일 기술자의 복사본들 사이에 공유된다.

    플래그 및 그들의 의미는 open(2)에 설명되어 있다.

F_GETLK, F_SETLK 그리고 F_SETLKW 들은 임의의 파일 잠금을 관리하는데 사용된다. 세번째 인수 lock은 구조체 flock(이 호출에 의해 겹쳐써질 수 있는)에 대한 포인터이다.

F_GETLK
    잠금을 얻을 수 없도록 제어하는 flock 구조로 리턴하거나, 다른 장애가 없다면,
     잠금의 l_type 필드를 F_UNLCK으로 설정한다.

F_SETLK
    l_type이 F_RDLCK 혹은 F_WRLCK일 때, 잠금이 설정된거나, l_type이 F_UNLCK일 때, 잠금은 소거된다. 다른 누군가에 의해 잠금(lock)이 이루어지면, 이 호출은 -1을 리턴하고, errno를 EACCES 혹은 EAGAIN로 설정한다.

F_SETLKW
    F_SETLK과 같지만, 에러를 리턴하는 대신에, 잠금이 풀려지기를 기다린다. 만일 fcntl이 기다리고 있을 때, 시그널이 잡히면, 이는 인터럽트되고, 시그널 처리기가 리턴된 후에, 즉시 리턴값 -1과 errno가 EINTR로 설정되어 리턴된다.

F_GETOWN, F_SETOWN, F_GETSIG 그리고 F_SETSIG 입출력(I/O) 유용성 시그널을 관리하는데 사용된다.

F_GETOWN
    파일 기술자 fd상에서 이벤트들에 대한 SIGIO 그리고 SIGURG 시그널들을 수신하는 프로세스 ID 또는 프로세스 그룹을 얻는다.

F_SETOWN
    파일 기술자 fd상에서 이벤트들에 대한 SIGIO 그리고 SIGURG 시그널들을 수신하는 프로세스 ID 또는 프로세스 그룹을 설정한다. 프로세스 그룹들은 음수값을 사용하여 지정된다. (F_SETSIG 은 SIGIO 대신에 다른 시그널을 명시하는데 사용될 수 있다. 만일 파일 기술자에서 이 플래그에 open(2) 호출을 제공하거나, fcntl의 F_SETFL 명령을 사용하여 O_ASYNC 상태 플래그를 설정하려면, 입력 또는 출력이 그 파일 기술자에서 가능하게 될때마다, SIGIO 시그널이 전송된다.

    시그널을 수신할 프로세스 혹은 프로세스 그룹은 fcntl 함수에 대한 F_SETOWN 명령을 사용함으로서 선택될 수 있다. 만일 파일 기술자가 소켓이면, 이는 또한 대여폭을 벗어난 데이터가 그 소켓에 도착할때 전달되는 SIGURG 시그널의 수신자를 선택한다. (SIGURG는 select(2)는 소켓을 "예외적인 조건"으로 보고하는 어떤 상황에서든 전송된다. 만일 파일 기술자가 터미널 장치와 일치한다면, SIGIO 시그널들은 터미널의 포그라운드 프로세스 그룹에 전송된다.

F_GETSIG
    입력 또는 출력이 가능해질 때, 시그널이 전송되도록 한다. 제로 값은 SIGIO가 전송되었다는 것을 의미한다. 다른 값(SIGIO을 포함)은 대신 보내진 시그널이다. 이런 경우, SA_SIGINFO가 설치되어 있으면, 시그널 처리기에 대한 추가적인 정보가 사용가능하다.

F_SETSIG
    입력 또는 출력이 가능해질때, 시그널이 전송되도록 설정한다. 제로 값은 디폴트 SGSIO 시그널을 전송하는 것을 의미한다. 다른 값(SIGIO을 포함)은 대신 보내진 시그널이다. 이런 경우, SA_SIGINFO가 설치되어 있으면, 시그널 처리기에 대한 추가적인 정보가 사용가능하다.

    제로가 아닌 값으로 F_SETSIG을 사용하고, 시그널 처리기에 대한 SA_SIGINFO를 설정( sigaction(2) 참조할 것)함으로서, 입출력(I/O 이벤트에 대한) 기타 정보가 siginfo_t 내의 처리기로 전달된다. si_code 필드는 소스가 SI_SIGIO라는 것을 가리키고, si_fd 필드는 파일 기술자와 이벤트를 관련시킨다. 그렇지 않으면, 어떤 파일 기술자들이 계류중인가에 대한 지시가 없고, 여러분은 입출력(I/O)에 사용가능한 파일 기술자들이 어떤 것인지를 결정하기 위해 유용한 메커니즘( (select(2), poll(2), read(2) O_NONBLOCK )을 사용해야 한다.

    POSIX.1b 실시간 시그널(값 >= SIGRTMIN)을 선택함으로서, 다중 입출력 이벤트들은 동일한 시그널 넘버들을 사용하여 대기행렬(큐)에 넣을 수 있다. (큐는 보통 사용가능한 메모리에 의존적이다.) 위와 같이 시그널 처리기에 대해 SA_SIGINFO가 설정되면, 기타 정보가 사용가능하다.

이러한 메커니즘을 사용하면, 프로그램은 대부분의 시간을 select(2) 혹은 poll(2)을 사용함 없이, 비동기적 입출력(I/O)을 구현할 수 있다.

O_ASYNC, F_GETOWN, F_SETOWN 의 사용은 BSD 및 리눅스에 특정적이다. F_GETSIG 와 F_SETSIG는 리눅스에만 특정적이다. POSIX는 비슷한 것들을 이루는데 비동기적 입출력과 aio_sigevent 구조를 이용한다. 이러한 것들은 또한 리눅스에서 GNU C 라이브러리(Glibc)의 부분으로서 사용할 수 있다.

반환값
성공적인 호출에 대하여, 리턴 값은 연산에 의존적이다.

F_DUPFD
    새로운 기술자

F_GETFD
    플래그의 값

F_GETFL
    플래그의 값

F_GETOWN
    기술자 소유자의 값

F_GETSIG
    읽기 또는 쓰기가 가능해졌을때 전송된 시그널의 값이나, 전통적인 SIGIO 행위에 대한 zero.

다른 모든 명령어
    Zero.

에러면, -1이 리턴되고, errno는 적절하게 설정된다.

에러

EACCES
    연산은 다른 프로세스에 의한 잠김에 의해 금지된다.

EAGAIN
    파일이 다른 프로세스에 의해 메모리 매핑이되었기 때문에, 연산은 방해받는다.

EBADF
    fd는 열린 파일 기술자가 아니다.

EDEADLK
    지정된 F_SETLKW 명령은 Deadlock을 초래할 것이라는 것이 감지되었다.

EFAULT
    lock은 여러분이 접근할 수 있는 주소 공간의 바깥에 있다.

EINTR
    F_SETLKW에 대하여, 명령은 시그널에 의해 인터럽트되었다. F_GETLK과 F_SETLK에 대하여, 명령은 잠김이 체크되거나, 이루어지기 전에 시그널에 의해 인터럽트되었다. 원격 파일을 잠그는(NFS 잠금) 것은 보통 로컬에서 발생한다.

EINVAL
    F_DUPFD에 대하여, arg은 음수 값이거나, 허용된 최대값보다는 크다. F_SETSIG에 대하여, arg은 허용될 수 있는 시그널 넘버가 아니다.

EMFILE
    F_DUPFD에 대하여, 프로세스는 이미 파일 기술자들의 최대 넘버가 열리도록 한다.

ENOLCK
    너무나 많은 시그먼트 잠금이 열렸고, 잠금 테이블은 꽉찼거나, 원격 잠금 프로토콜이 실패하였다. (NFS를 통해 잠그기)

EPERM
    추가 속성이 지정되도록 하는 파일에서 O_APPEND 플래그를 소거하고자 함

주의
dup2에 의해 리턴된 에러들은 F_DUPFD에 의해 리턴된 에러들과는 다르다.

호환
SVr4, SVID, POSIX, X/OPEN, BSD 4.3. 오직 F_DUPFD, F_GETFD, F_SETFD, F_GETFL, F_SETFL, F_GETLK, F_SETLK 그리고 F_SETLKW의 연산들만이 POSIX.1내에 명시되어 있다. F_GETOWN 과 F_SETOWN 들은 SVr4에서 지원되지 않는 BSDism이다.
 F_GETSIG 과 F_SETSIG는 리눅스에 특정적이다. F_GETFL/F_SETFL용 플래그들은 open(2)에 의해 지원되는 플래그들이고, 시스템에 따라 다르다. O_APPEND, O_NONBLOCK, O_RDONLY, 그리고 O_RDWR은 POSIX.1내에 명시되어 있다. SVr4은 여기에서 문서화하지 않은 몇개의 다른 옵션들과 플래그를 지원한다.

SVr4는 추가적인 EIO, ENOLINK 그리고 EOVERFLOW 에러 조건들에 대한 문서화를 한다.

관련 항목
dup2(2), open(2), socket(2), flock(2)

번역
ASPLINUX <man@asp-linux.co.kr> 2000년 7월 29일
한글 Manpage 프로젝트 (http://man.kldp.org) 2005년 2월 17일