ফাইল এবং I/O কন্ট্রোল করতে হলে, আমাদের fcntl মডিউল ব্যবহার করতে হবে। এটি মূলত fcntl() এবং ioctl() ইউনিক্স রুটিনের একটি ইন্টারফেস।
এই মডিউলের সব মেথড তাদের প্রথম আর্গুমেন্ট হিসেবে একটি ইন্টিজার বা 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) মেথড
এই মেথড ফাইল ডেসক্রিপ্টর ব্যবহার করে ফাইল ওপর লক অপারেশন op বাস্তবায়ন করতে ব্যবহৃত হয়। কিছু সিস্টেমে, এই মেথড fcntl() মেথড ব্যবহার করে এমুলেট করা যেতে পারে।
fcntl.lockf(fd, operation[, length[, start[, whence]]]) মেথড
এই মেথড লকিং কলের র্যাপার হিসেবে বাস্তবায়ন করতে ব্যবহৃত হয়। operation আর্গুমেন্ট ফাইল লক বা আনলক করার জন্য পাস করা হয়। operation-এর বিভিন্ন মান রয়েছে।
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') # শুরুর নম্বর হিসেবে ০ সংরক্ষণ
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 $