फाइल्स और 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 पर निर्भर करेगा। जब यह ट्रू होता है, तो बफर म्यूटेबल हो सकता है, अन्यथा यह रीड-ओनली बफर की तरह कार्य करेगा।
मेथड fcntl.flock(fd, op)
यह मेथड फाइल डिस्क्रिप्टर का उपयोग करके फाइल पर लॉक ऑपरेशन op करने के लिए उपयोग किया जाता है। कुछ सिस्टम्स पर, इस मेथड को fcntl() मेथड का उपयोग करके एमुलेट किया जा सकता है।
मेथड fcntl.lockf(fd, operation[, length[, start[, whence]]])
यह मेथड लॉकिंग कॉल्स के चारों ओर एक वॉपर के रूप में कार्य करने के लिए उपयोग किया जाता है। ऑपरेशन आर्गुमेंट को फाइल को लॉक या अनलॉक करने के लिए पास किया जाता है। ऑपरेशन के अलग-अलग मान हैं।
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') # शुरुआती नंबर के रूप में 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 $