2014-04-28 6 views
6

के साथ लिनक्स में बंद() फ़ंक्शन को प्रतिस्थापित करना मैं लिनक्स में close() फ़ंक्शन का अपना कार्यान्वयन प्रदान करने का प्रयास कर रहा हूं। क्यूं कर? क्योंकि मुझे पता चला कि आप ऐसा कर सकते हैं और यह मजेदार लगता है।लिनक्स में अपने बंद() फ़ंक्शन

यहाँ myclose.c है:

all: myclose.so my-close.so 

%.so: %.o 
    gcc -shared -o [email protected] $< 

%.o:%.c 
    gcc -c -fPIC -o [email protected] $< 

clean: 
    rm -f *.so *.o 

संकलन के बाद, मैं चलाने:

export LD_PRELOAD=`pwd`/myclose.so 

तब मैं चलाएँ:

cat myclose.c 

#include <stdio.h> 

int close(int fd) { 
    printf("Closing fd: %d\n", fd); 
    return 0; 
} 

यहाँ मेरी makefile है

उत्पादन मैं मिलता है:

#include <stdio.h> 

int close(int fd) { 
    printf("Closing fd: %d\n", fd); 
    return 0; 
} 
Closing fd: 3 

आहा! सही काम करता है? लगभग। cat एक बार से अधिक close() पर कॉल करता है, लेकिन हम केवल आउटपुट की एक पंक्ति देखते हैं। strace (और सामान्य ज्ञान) के अनुसार, close() फ़ाइल डिस्क्रिप्टर 1 और 2 के लिए भी बुलाया जाना चाहिए। यदि मैं cat * चलाता हूं और निर्देशिका में सभी फाइलों को बिल्ली चलाता हूं, तो मुझे निर्देशिका में अंतिम फ़ाइल तक "बंद Fd: 3", "बंद Fd: 4" आदि दिखाई देता है। चूंकि इन सभी फाइल डिस्क्रिप्टर 2 से अधिक हैं, मैंने सोचा कि शायद विशेष फ़ाइल डिस्क्रिप्टर (stdout और stderr) को बंद करने में कोई समस्या थी। हालांकि, जब मैं ls चलाता हूं तो मुझे केवल नियमित आउटपुट दिखाई देता है और कोई "बंद करने वाली एफडी:" लाइनें नहीं होती हैं, जिसका अर्थ है कि यह ls के लिए काम नहीं करता है, भले ही close(3) दिखाता है ls चलाते समय।

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

+0

मैं यहां पूरी तरह से गलत हो सकता हूं, लेकिन क्या शैल एफडी 1 और 2 की देखभाल नहीं कर रहा है? क्या आपने अपने "करीबी()" के साथ इसे खोलने के लिए खोल खोलने का प्रयास किया है? – lorenzog

उत्तर

1

मुझे आश्चर्य है कि यह काम करता है और साथ ही साथ किया!

आप सी पुस्तकालय प्रविष्टि को बंद() के लिए बंद कर रहे हैं, सिस्टम कॉल नहीं। हालांकि, सी पुस्तकालय के अन्य हिस्सों का अभी भी उन कार्यक्रमों के लिए उपयोग किया जा रहा है। शायद पहले 3 फाइल हैंडल के लिए कुछ सीधा जुड़ाव है। आप जिस सी पुस्तकालय का उपयोग कर रहे हैं उसके स्रोत पर नज़र डालें।

2

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

close -Call लागू करने वाली लाइब्रेरी में स्थिर किसी भी प्रोग्राम को "प्रतिस्थापित" करने में विफल रहेगा।

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

संबंधित मुद्दे