Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Python

Các lệnh hệ thống fcntl và ioctl trong Python

Để kiểm soát file và I/O, ta nên dùng module fcntl. Đây về cơ bản là một giao diện đến các routine fcntl() và ioctl() của Unix.

Tất cả phương thức trong module này nhận một số nguyên hoặc file-descriptor kiểu io.IOBase làm đối số đầu tiên.

Để dùng module này, nên nhập bằng:

import fcntl

Một số phương thức của module fcntl:

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

Thực hiện thao tác trên file bằng file descriptor. Thao tác được định nghĩa bởi op. Đối số thứ ba tùy chọn. Có thể là kiểu integer hoặc string. Khi đối số là integer, giá trị trả về là giá trị của lời gọi C fcntl(). Khi là string, nó đại diện cấu trúc nhị phân. Khi hàm thất bại, ném IOError.

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

Giống hệt fcntl(), nhưng xử lý đối số phức tạp hơn. Trong đối số, nếu buffer có thể thay đổi (mutable) được truyền, hành vi sẽ phụ thuộc vào mutate_flag. Khi true, buffer có thể mutable, ngược lại hoạt động như buffer chỉ đọc (read-only).

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

Thực hiện thao tác khóa (lock) op trên file bằng file_descriptor. Trên một số hệ thống, phương thức này có thể được giả lập bằng fcntl().

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

Dùng như một wrapper quanh các lời gọi khóa. Đối số operation truyền để khóa hoặc mở khóa file. Có các giá trị operation khác nhau:

  • LOCK_UN – Mở khóa file
  • LOCK_SH – Khóa chung (Shared Lock)
  • LOCK_EX – Khóa độc quyền (Exclusive Lock)

Mã ví dụ

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')  # Lưu 0 làm số bắt đầu
    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)

Kết quả

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