c - Replacing the close() function in Linux with my own close() function -
मैं लिनक्स में close ()
फ़ंक्शन का अपना स्वयं का कार्यान्वयन करने का प्रयास कर रहा हूं। क्यूं कर? क्योंकि मुझे अभी पता चला है कि आप ऐसा कर सकते हैं और यह मजेदार लग रहा है।
यहां myclose.c है:
#include & lt; stdio.h & gt; इंट क्लोज़ (इंट एफडी) {printf ("क्लोजिंग एफडी:% डी \ n", एफडी); वापसी 0; }
यहां मेरा मेकफाइल है:
सब: myclose.so my-close.so% .so:% .o जीसीसी -शेअर -ओ $ @ $ & LT; % .o:%। C gcc -c -fPIC -o $ @ $ & lt; संकलन के बाद, मैं चला:
दिखाता है।निर्यात LD_PRELOAD = `pwd` / myclose.so
कोड>फिर मैं चलाता हूं:
cat myclose.c
मुझे मिल रहा आउटपुट है:
#include & lt; stdio.h & gt; इंट क्लोज़ (इंट एफडी) {printf ("क्लोजिंग एफडी:% डी \ n", एफडी); वापसी 0; } समापन fd: 3
यै! सही काम करता है? लगभग।
cat
कॉलबंद ()
एक से अधिक बार, लेकिन हम केवल आउटपुट की एक पंक्ति देखते हैं।strace
(और सामान्य ज्ञान) के अनुसार,close ()
को फ़ाइल डिसिप्टर 1 और 2 के लिए भी बुलाया जाना चाहिए यदि मैंcat *
को चलाता हूं और निर्देशिका में सभी फाइलों को बिल्ली में डालता हूं, तो मुझे "closing fd: 3", "closing fd: 4", आदि को अंतिम फाइल में डाइरेक्टरी में देखें। चूंकि इन सभी फाइल डिस्क्रिप्टर्स 2 से अधिक हैं, इसलिए मैंने सोचा कि शायद विशेष फाइल डिस्क्रिप्टर्स (स्टडआउट और स्टेडरआर) को बंद करने के साथ कोई समस्या थी। हालांकि, जब मैंls
को चलाता हूं, तो मैं केवल नियमित आउटपुट और नहीं "क्लोज़िंग एफडी:" लाइनों को देखता हूं, जिसका मतलब है कि यहls
के लिए काम नहीं करता है, भले ही<
बंद (3)ls
चलते समयक्या गलत हो सकता है पर कोई विचार?
इस तरह की "प्रतिस्थापन" केवल गतिशील रूप से जुड़े कार्यक्रमों के लिए काम करता है।
बंद
-कॉल लागू करने वाला पुस्तकालय इसे "प्रतिस्थापित" करने में विफल होगा
बाद में प्रत्येक कॉल के लिए close ()
को मूल कोड को लागू करने के लिए close ()
का मामला होगा और मानक फ़ाइल विवरणकर्ता 0
, 1
, और 2
के मामले में भी ऐसा लगता है कि उनका समापन सबसे अधिक समान रूप से लागू होता है लाइब्रेरी, जो उपयोग में लाइब्रेरी कार्यान्वयन में है।
Comments
Post a Comment