ในการควบคุมไฟล์และ 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 $