के साथ लिनक्स में बंद() फ़ंक्शन को प्रतिस्थापित करना मैं लिनक्स में 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
चलाते समय।
क्या गलत हो सकता है पर कोई विचार?
मैं यहां पूरी तरह से गलत हो सकता हूं, लेकिन क्या शैल एफडी 1 और 2 की देखभाल नहीं कर रहा है? क्या आपने अपने "करीबी()" के साथ इसे खोलने के लिए खोल खोलने का प्रयास किया है? – lorenzog