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_SZ—fd가 가리키는 파이프의 용량을 (함수 결과로) 돌려줘요.F_SETPIPE_SZ—fd가 가리키는 파이프의 용량을 최소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_EXCL—O_CREAT와 함께 쓰이며, 파일이 존재하면 실패.O_TRUNC— 열 때 파일을 잘라냄(truncate).O_NDELAY/O_NONBLOCK— non-blocking 모드로 열기.O_NOCTTY— controlling TTY가 되지 않게 TTY 열기.O_ACCMODE— 읽기/쓰기 플래그를 추출하기 위한 마스크.VERSION— 버전 문자열.