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 के लिए काम नहीं करता है, भले ही < ls चलते समय बंद (3) दिखाता है।

क्या गलत हो सकता है पर कोई विचार?

इस तरह की "प्रतिस्थापन" केवल गतिशील रूप से जुड़े कार्यक्रमों के लिए काम करता है।

बंद -कॉल लागू करने वाला पुस्तकालय इसे "प्रतिस्थापित" करने में विफल होगा

बाद में प्रत्येक कॉल के लिए close () को मूल कोड को लागू करने के लिए close () का मामला होगा और मानक फ़ाइल विवरणकर्ता 0 , 1 , और 2 के मामले में भी ऐसा लगता है कि उनका समापन सबसे अधिक समान रूप से लागू होता है लाइब्रेरी, जो उपयोग में लाइब्रेरी कार्यान्वयन में है।


Comments

Popular posts from this blog

Editing Python Class in Shell and SQLAlchemy -

import - Python ImportError: No module named wmi -

uislider - In a MATLAB GUI, how does one implement a continuously varying slider from a GUIDE created .m file? -