Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

Python의 fcntl 및 ioctl 시스템 호출

<시간/>

파일과 io를 제어하려면 fcntl을 사용해야 합니다. 기준 치수. 기본적으로 fcntl() 및 ioctl() Unix 루틴에 대한 하나의 인터페이스입니다.

이 모듈의 모든 메서드는 하나의 정수 또는 io.IOBase 파일 설명자를 첫 번째 인수로 사용합니다.

이 모듈을 사용하려면 다음을 사용하여 가져와야 합니다.

import fcntl

fcntl 모듈에는 다음과 같은 모듈이 있습니다.

메서드 fcntl.fcntl(fd, op[, arg])

이 메소드는 파일 디스크립터를 사용하여 파일에 대한 작업을 수행하는 데 사용됩니다. 작업은 op에 의해 정의됩니다. . 세 번째 인수는 선택 사항입니다. 정수 유형 값 또는 문자열 유형 값일 수 있습니다. 인수가 정수형이면 반환값은 C fcntl() 호출의 값이 됩니다. 문자열인 경우 바이너리 구조를 나타냅니다. 이 함수가 실패하면 IOError가 발생합니다.

메서드 fcntl.ioctl(fd, op[, arg[, mutate_flag]])

이 메서드는 fcntl() 메서드와 동일하지만 이 경우 인수 처리가 더 복잡합니다. 인수에서 변경 가능한 버퍼가 전달되면 동작은 mutate_flag에 따라 달라집니다. true이면 버퍼를 변경할 수 있고 그렇지 않으면 읽기 전용 버퍼처럼 작동합니다.

메소드 fcntl.flock(fd, op)

이 메서드는 file_descriptor를 사용하여 파일에 대한 잠금 작업을 수행하는 데 사용됩니다. 일부 시스템에서는 fcntl() 메서드를 사용하여 이 메서드를 에뮬레이트할 수 있습니다.

메서드 fcntl.lockf(fd, operation[, length[, start[, whence]]])

이 메서드는 잠금 호출을 래퍼로 수행하는 데 사용됩니다. 작업 인수는 파일을 잠그거나 잠금 해제하기 위해 전달됩니다. 연산 값이 다릅니다.

  • LOCK_UN − 파일 잠금을 해제하려면

  • LOCK_SH − 공유 잠금

  • LOCK_EX − 전용 잠금

예시 코드

import fcntl, os, time
counter_file = 'my_counter.txt'
if not os.path.exists(counter_file):
   counter_file = open('my_counter.txt', 'w')
   counter_file.write('0') #Store 0 as starting number
   counter_file.close()
for i in range(15):
   counter_file = open('my_counter.txt', 'r+')
   fcntl.flock(counter_file.fileno(), fcntl.LOCK_EX)
   count = int(counter_file.readline()) + 1
   counter_file.seek(0)
   counter_file.write(str(count))
   counter_file.close()
   print('Process ID: ' + str(os.getpid()) + ', Count: ' + str(count))
   time.sleep(0.2)

출력

$ python3 example.py
Process ID: 12698, Count: 1
Process ID: 12698, Count: 2
Process ID: 12698, Count: 3
Process ID: 12698, Count: 4
Process ID: 12698, Count: 5
Process ID: 12698, Count: 6
Process ID: 12698, Count: 7
Process ID: 12698, Count: 8
Process ID: 12698, Count: 9
Process ID: 12698, Count: 10
Process ID: 12698, Count: 11
Process ID: 12698, Count: 12
Process ID: 12698, Count: 13
Process ID: 12698, Count: 14
Process ID: 12698, Count: 15
$
$
$ cat my_counter.txt
15
$