Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

การเรียกระบบ fcntl และ ioctl ใน Python


ในการควบคุมไฟล์และ io เราควรใช้ fcntl โมดูล. โดยพื้นฐานแล้วมันเป็นอินเทอร์เฟซเดียวสำหรับรูทีน Unix fcntl() และ ioctl()

เมธอดทั้งหมดในโมดูลนี้ใช้ตัวอธิบายไฟล์หนึ่งจำนวนเต็มหรือ io.IOBase เป็นอาร์กิวเมนต์แรก

ในการใช้โมดูลนี้ เราควรนำเข้าโดยใช้

import fcntl

มีบางโมดูลของโมดูล fcntl เหล่านี้คือ −

วิธีการ fcntl.fcntl(fd, op[, arg])

วิธีนี้ใช้เพื่อดำเนินการกับไฟล์โดยใช้ file descriptor การดำเนินการถูกกำหนดโดย op . อาร์กิวเมนต์ที่สามเป็นทางเลือก อาจเป็นค่าประเภทจำนวนเต็มหรือค่าประเภทสตริงก็ได้ เมื่ออาร์กิวเมนต์เป็นประเภทจำนวนเต็ม ค่าส่งกลับจะเป็นค่าของการเรียก C fcntl() เมื่อเป็นสตริง จะแสดงโครงสร้างไบนารี เมื่อฟังก์ชันนี้ล้มเหลว จะทำให้เกิด IOError

วิธีการ fcntl.ioctl(fd, op[, arg[, mutate_flag]])

เมธอดนี้เหมือนกับเมธอด fcntl() แต่ในกรณีนี้ การจัดการอาร์กิวเมนต์ซับซ้อนกว่า ในอาร์กิวเมนต์ หากบัฟเฟอร์ที่เปลี่ยนแปลงได้ถูกส่งผ่านไป พฤติกรรมของบัฟเฟอร์จะขึ้นอยู่กับ mutate_flag เมื่อเป็นจริง บัฟเฟอร์สามารถเปลี่ยนแปลงได้ มิฉะนั้น จะทำหน้าที่เป็นบัฟเฟอร์แบบอ่านอย่างเดียว

วิธีการ fcntl.flock(fd, op)

เมธอดนี้ใช้เพื่อดำเนินการล็อกไฟล์โดยใช้ file_descriptor ในบางระบบ วิธีนี้สามารถจำลองได้โดยใช้เมธอด fcntl()

วิธี fcntl.lockf(fd, operation[, length[, start[, ที่ไหน]]])

วิธีนี้ใช้เพื่อทำหน้าที่เป็นตัวห่อหุ้มรอบการล็อกการโทร อาร์กิวเมนต์การดำเนินการถูกส่งผ่านเพื่อล็อกหรือปลดล็อกไฟล์ มีค่าการทำงานที่แตกต่างกัน

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