fcntl — fcntl 및 ioctl 시스템 호출

fcntl — fcntl 및 ioctl 시스템 호출

이 모듈은 파일 디스크립터에 대한 파일 및 I/O 제어를 수행합니다. fcntl()ioctl() 유닉스 루틴의 인터페이스입니다. 자세한 내용은 fcntl(2)ioctl(2) 유닉스 매뉴얼 페이지를 참고하세요. 사용 가능한 환경: Unix, WASI 아님.

출처: Python documentation

본문

이 모듈의 모든 함수는 첫 번째 인자로 파일 디스크립터 fd를 받습니다. 이는 sys.stdin.fileno()가 반환하는 정수 파일 디스크립터이거나, 실제 파일 디스크립터를 반환하는 fileno()를 제공하는 io.IOBase 객체(예: sys.stdin 자체)일 수 있습니다.

주요 함수

fcntl.fcntl(fd, cmd, arg=0, /) — 파일 디스크립터 fd에 연산 cmd를 수행합니다(fileno() 메서드를 제공하는 파일 객체도 허용됨). cmd에 사용되는 값은 운영 체제에 의존하며 fcntl 모듈에 관련 C 헤더 파일과 같은 이름의 상수로 사용할 수 있습니다. arg는 정수 값, bytes-like 객체, 또는 문자열일 수 있으며, 타입과 크기가 관련 C 문서에 지정된 연산 인자의 타입과 크기와 일치해야 합니다.

  • arg가 정수이면 함수는 C fcntl() 호출의 정수 반환 값을 반환합니다.
  • 인자가 bytes-like 객체이면 이진 구조를 나타내며(예: struct.pack()으로 만든 것), 문자열 값은 UTF-8로 인코딩됩니다. 바이너리 데이터는 버퍼에 복사되어 C fcntl() 호출에 주소가 전달됩니다. 성공 호출 후 반환 값은 bytes 객체로 변환된 버퍼 내용입니다. 반환 객체의 길이는 arg의 길이와 같으며 1024바이트로 제한됩니다.
  • fcntl() 호출이 실패하면 OSError가 발생합니다.

arg의 타입이나 크기가 불일치하면(예: 포인터가 필요한데 정수를 전달) 세그멘테이션 위반이나 더 미묘한 데이터 손상이 발생할 가능성이 높습니다. fcntl.fcntl 감사 이벤트를 인자 fd, cmd, arg로 발생시킵니다.

fcntl.ioctl(fd, request, arg=0, mutate_flag=True, /) — 인자 처리가 더 복잡하다는 점 외에는 fcntl() 함수와 동일합니다. request 매개변수는 플랫폼에 따라 32비트 또는 64비트에 맞는 값으로 제한됩니다. arg가 읽기-쓰기 버퍼 인터페이스(예: bytearray)를 지원하고 mutate_flag가 true(기본값)이면 버퍼가 기본 ioctl() 시스템 호출에 전달되고, 반환 코드가 Python에 전달되며, 버퍼의 새 내용이 ioctl()의 동작을 반영합니다. ioctl() 호출이 실패하면 OSError를 발생시킵니다. 3.14부터 시스템 호출 중 항상 GIL이 해제되고 EINTR로 실패한 시스템 호출은 자동으로 재시도됩니다.

fcntl.flock(fd, operation, /) — 파일 디스크립터 fd에 잠금 연산 operation을 수행합니다. 자세한 내용은 flock(2) 매뉴얼을 참조하세요 (일부 시스템에서는 fcntl()으로 에뮬레이션됨). 실패하면 OSError를 발생시킵니다.

fcntl.lockf(fd, cmd, len=0, start=0, whence=0, /) — 기본적으로 fcntl() 잠금 호출을 감싼 래퍼입니다. start 기본값은 0(파일 시작)이고, len 기본값은 0(파일 끝까지 잠금)이며, whence 기본값도 0입니다.

상수

버전별로 다양한 상수가 노출됩니다: F_ADD_SEALS, F_GET_SEALS, F_SEAL_*(3.8), F_GETPATH(3.9, macOS), F_OFD_GETLK/F_OFD_SETLK/F_OFD_SETLKW(3.9, Linux), F_GETPIPE_SZ/F_SETPIPE_SZ(3.10), F_DUP2FD/F_DUP2FD_CLOEXEC(3.11, FreeBSD), FICLONE/FICLONERANGE(3.12, reflink/COW), F_GETOWN_EX 등 여러 상수(3.13), F_DUPFD_QUERY(3.14) 등이 있습니다.

예제

import struct, fcntl, os

f = open(...)
rv = fcntl.fcntl(f, fcntl.F_SETFL, os.O_NDELAY)

lockdata = struct.pack('hhllhh', fcntl.F_WRLCK, 0, 0, 0, 0, 0)
rv = fcntl.fcntl(f, fcntl.F_SETLKW, lockdata)

첫 번째 예에서 반환 값 변수 rv는 정수 값을, 두 번째 예에서는 bytes 객체를 담습니다. lockdata 변수의 구조 레이아웃은 시스템에 의존하므로 flock() 호출을 사용하는 것이 더 나을 수 있습니다. BSD의 os 모듈에 O_SHLOCKO_EXLOCK 잠금 플래그가 있으면 os.open()lockf()flock()의 대안을 제공합니다.

더 알아보기 (Learn more)