Fcntl 모듈

Fcntl 모듈 (Fcntl)

Fcntl 모듈은 시스템의 <fcntl.h> C 헤더 파일에 정의된 상수들을 로드해 줘요. 이 상수들은 POSIX 시스템 콜인 fcntl(2)open(2)와 함께 쓰이죠.

  • fcntl(2) 연산을 하려면 IO::fcntl을 써요.
  • open(2) 연산을 하려면 IO::sysopen을 써요.

사용 가능한 연산과 상수의 집합은 운영체제에 따라 달라요. 아래에 나열된 값 중 일부는 여러분 시스템에서 지원되지 않을 수 있어요. 완전한 내용은 시스템의 fcntl(2) man 페이지를 참고하세요.

예를 들어 /tmp/tempfile을 쓰기 전용으로 열되, 존재하지 않으면 생성하는 코드는 이렇게 돼요.

require 'fcntl'
fd = IO.sysopen('/tmp/tempfile',
                Fcntl::O_WRONLY | Fcntl::O_EXCL | Fcntl::O_CREAT)
f = IO.open(fd)
f.syswrite("TEMP DATA")
f.close

파일 s의 플래그를 조회하고, 그 위에 non-blocking 플래그를 추가하는 예시도 볼게요.

m = s.fcntl(Fcntl::F_GETFL, 0)
f.fcntl(Fcntl::F_SETFL, Fcntl::O_NONBLOCK|m)

출처: Ruby 4.0 API

본문

상수 (Constants)

이 모듈이 제공하는 핵심은 상수들이에요. 크게 파일 서술자(fd) 관련 F_* 플래그와 open 옵션 관련 O_* 플래그로 나뉘죠.

  • FD_CLOEXEC — close-on-exec 플래그의 값.
  • F_DUPFD — 인자보다 크거나 같은 최소 사용되지 않는 파일 서술자로 파일 서술자를 복제해요. 복제된 서술자의 close-on-exec 플래그는 설정돼요. (Ruby는 레이스 조건을 피하기 위해 가능하면 F_DUPFD_CLOEXEC를 내부적으로 사용하고, 그게 없으면 F_SETFD를 써요.)
  • F_GETFD — 파일 서술자의 close-on-exec 플래그를 읽어요.
  • F_GETFL — 파일 서술자 플래그를 가져와요. 이는 O_* 플래그 중 하나 이상이에요.
  • F_SETFD — 파일 서술자의 close-on-exec 플래그를 설정해요.
  • F_SETFL — 파일 서술자 플래그를 설정해요. 이는 O_* 플래그 중 하나 이상이에요.
  • F_GETLK — 파일의 주어진 영역이 잠겨 있는지 결정해요. F_*LK 플래그 중 하나를 사용해요.
  • F_SETLK — 파일의 영역에 잠금을 획득해요.
  • F_SETLKW — 필요하면 기다리면서 파일의 영역에 잠금을 획득해요.
  • F_RDLCK / F_WRLCK / F_UNLCK — 파일 영역에 대한 읽기/쓰기/제거 잠금 플래그.
  • F_GETPIPE_SZfd가 가리키는 파이프의 용량을 (함수 결과로) 돌려줘요.
  • F_SETPIPE_SZfd가 가리키는 파이프의 용량을 최소 arg 바이트로 바꿔요.
  • F_DUP2FD — FreeBSD 전용 상수로, dup2 호출과 동등해요.
  • F_DUP2FD_CLOEXEC — FreeBSD 전용 상수로, F_DUP2FD처럼 동작하되 추가로 FD_CLOEXEC 플래그를 설정해요.
  • macOS 전용 F_PREALLOCATE 관련: F_ALLOCATEALL, F_ALLOCATECONTIG, F_ALLOCATEPERSIST, F_PEOFPOSMODE, F_PREALLOCATE, F_VOLPOSMODE.

open 옵션 계열 상수는 이렇게 정리돼요.

  • O_RDONLY — 읽기 전용 모드로 열기.
  • O_WRONLY — 쓰기 전용 모드로 열기.
  • O_RDWR — 읽기-쓰기 모드로 열기.
  • O_APPEND — append 모드로 열기.
  • O_CREAT — 파일이 없으면 생성.
  • O_EXCLO_CREAT와 함께 쓰이며, 파일이 존재하면 실패.
  • O_TRUNC — 열 때 파일을 잘라냄(truncate).
  • O_NDELAY / O_NONBLOCK — non-blocking 모드로 열기.
  • O_NOCTTY — controlling TTY가 되지 않게 TTY 열기.
  • O_ACCMODE — 읽기/쓰기 플래그를 추출하기 위한 마스크.
  • VERSION — 버전 문자열.