Computer >> Máy Tính >  >> Lập trình >> Python

Lệnh gọi hệ thống fcntl và ioctl bằng Python

Để kiểm soát các tệp và io, chúng ta nên sử dụng fcntl mô-đun. Về cơ bản, nó là một giao diện cho các quy trình fcntl () và ioctl () Unix.

Tất cả các phương thức trong mô-đun này lấy một số nguyên hoặc bộ mô tả tệp io.IOBase làm đối số đầu tiên của chúng.

Để sử dụng mô-đun này, chúng ta nên nhập nó bằng cách sử dụng.

import fcntl

Có một số mô-đun của mô-đun fcntl, đây là -

Phương thức fcntl.fcntl (fd, op [, arg])

Phương pháp này được sử dụng để thực hiện thao tác trên tệp bằng cách sử dụng bộ mô tả tệp. Hoạt động được xác định bởi op . Đối số thứ ba là tùy chọn. Nó có thể là giá trị kiểu số nguyên hoặc giá trị kiểu chuỗi. Khi đối số là kiểu số nguyên, giá trị trả về sẽ là giá trị của lệnh gọi C fcntl (). Khi nó là chuỗi, nó đại diện cho cấu trúc nhị phân. Khi chức năng này không thành công, nó sẽ xuất hiện IOError.

Phương thức fcntl.ioctl (fd, op [, arg [, mutate_flag]])

Phương thức này giống với phương thức fcntl (), nhưng trong trường hợp này, việc xử lý đối số phức tạp hơn. Trong đối số, nếu bộ đệm có thể thay đổi được truyền, thì hành vi của nó sẽ phụ thuộc vào mutate_flag. Khi nó là true, bộ đệm có thể thay đổi được, nếu không, nó sẽ hoạt động giống như bộ đệm chỉ đọc.

Phương thức fcntl.flock (fd, op)

Phương pháp này được sử dụng để thực hiện op hoạt động khóa trên tệp bằng cách sử dụng file_descriptor. Trên một số hệ thống, phương thức này có thể được mô phỏng bằng phương thức fcntl ().

Phương thức fcntl.lockf (fd, operation [, length [, start [, whence]]])

Phương thức này được sử dụng để thực hiện như một trình bao bọc xung quanh các cuộc gọi khóa. Đối số hoạt động được chuyển để khóa hoặc mở khóa tệp. Có các giá trị hoạt động khác nhau.

  • LOCK_UN - Để mở khóa tệp

  • LOCK_SH - Khóa dùng chung

  • LOCK_EX - Khóa độc quyền

Mã mẫu

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)

Đầu ra

$ 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
$