2009-08-10 6 views
5

मैं सोच रहा हूं कि scanf()/printf() वास्तव में हार्डवेयर और ओएस स्तरों में कैसे काम करता है। डेटा प्रवाह कहां और ओएस इन समय के आसपास क्या कर रहा है? ओएस क्या कॉल करता है? और इतने पर ...ओएस के अंदर scanf() कैसे काम करता है?

+2

आप के बारे में क्या बात कर रहे हैं ओएस? –

+0

अधिक जानकारी की आवश्यकता है, – rahul

+0

मैं किसी भी विशेष ओएस को नहीं देख रहा हूं। लिनक्स/यूनिक्स प्रकार ठीक होंगे। मैं सिर्फ स्थिति की बुनियादी समझ चाहता हूं। – jetru

उत्तर

20

स्कैनफ़() और printf() libc (सी मानक लाइब्रेरी) में कार्यरत हैं, और क्रमशः फ़ाइल डिस्क्रिप्टर stdin और stdout से बात करते हुए वे क्रमशः पढ़ने() और लिखने() ऑपरेटिंग सिस्टम सिस्को कहते हैं (fscanf और fprintf आपको उस फ़ाइल स्ट्रीम को निर्दिष्ट करने की अनुमति देता है जिसे आप पढ़ना/लिखना चाहते हैं)।

पढ़ने के लिए कॉल() और लिखना() (और सभी सिस्कोल्स) परिणामस्वरूप आपके उपयोगकर्ता-स्तरीय अनुप्रयोग से कर्नेल मोड में 'संदर्भ स्विच' होता है, जिसका अर्थ यह है कि यह विशेषाधिकार प्राप्त संचालन कर सकता है, जैसे कि सीधे हार्डवेयर से बात करना । पर कैसे आप आवेदन शुरू कर दिया निर्भर करता है, 'stdin' और 'stdout' फ़ाइल वर्णनकर्ता शायद एक कंसोल डिवाइस (जैसे tty0 के रूप में), या (एक xterm द्वारा उजागर की तरह) आभासी कंसोल डिवाइस के कुछ प्रकार के लिए बाध्य कर रहे हैं। पढ़ें() और लिखें() एक 'यूओ' नामक कर्नेल बफर से डेटा को सुरक्षित रूप से कॉपी करें। scanf और printf की

प्रारूप स्ट्रिंग रूपांतरण हिस्सा कर्नेल मोड में नहीं होती है, लेकिन सिर्फ साधारण उपयोगकर्ता मोड (अंदर 'libc') में, syscalls साथ अंगूठे का सामान्य नियम आप मोड कर्नेल के लिए स्विच के रूप में बार बार के रूप में है संभव है, दोनों संदर्भ स्विचिंग के प्रदर्शन ओवरहेड से बचने के लिए, और सुरक्षा के लिए (आपको कर्नेल मोड में होने वाली किसी भी चीज के बारे में बहुत सावधान रहना होगा! कर्नेल मोड में कम कोड ऑपरेटिंग सिस्टम में कम बग/सुरक्षा छेद का मतलब है)।

btw .. यह सब एक यूनिक्स के नजरिए से लिखा गया था, मैं नहीं जानता कि कैसे एमएस विंडोज काम करता है।

+0

संदर्भ स्विच धीमा लगता है अगर यह अलग-अलग प्रत्येक बाइट को पढ़ता है। बेशक, यह वास्तव में इस दिन और उम्र में कोई फर्क नहीं पड़ता है, लेकिन मुझे यह जानने में दिलचस्पी है कि मैं इस समझ में सही हूं या नहीं। –

+1

पढ़ने और लिखने syscalls बाइट्स मानकों के रूप यूआईओ के माध्यम से हस्तांतरण करने के लिए के एक नंबर ले, तो यह हर एक बाइट के लिए एक अलग syscall बनाने के लिए नहीं है। आप यह भी सोचेंगे कि getchar() जैसे सरल इनपुट फ़ंक्शंस के लिए प्रत्येक चरित्र के लिए एक अलग कॉल होना होगा, लेकिन वास्तव में इन दिनों libc उस से थोड़ा सा चालाक है और यह एक बफर (libc के अंदर) रखता है। तो यह संदर्भ बफर को भरकर बहुत से संदर्भ स्विचिंग के प्रदर्शन ओवरहेड से बच सकता है, फिर जब भी बफर खाली होता है, तब तक प्रत्येक बार जब आप getchar() या scanf() को प्रोसेस करते हैं, और केवल तब एक और सिस्कल बनाते हैं। –

+0

"इस दिन में वास्तव में कोई फर्क नहीं पड़ता" के विषय पर, वास्तव में आपको आश्चर्य होगा कि हर समय सिस्कोल कितनी महत्वपूर्ण प्रदर्शन को प्रभावित करेगा। इस बात पर विचार करें कि नियमित कार्य कॉल के रूप में कम से कम * 10 गुना धीमा है। यदि आपके पास आकार 1024 बाइट्स का बफर है, उदाहरण के लिए, आप केवल 1/1024 को कई सिस्को बना रहे हैं।बफर के साथ और बिना 'सीपी' कमांड का सी कार्यान्वयन लिखना एक अच्छा उदाहरण है, मैं इसे कुछ मिनटों में पोस्ट करूंगा। –

0

मुझे लगता है कि ओएस सिर्फ दूर कैसे आउटपुट डेटा प्रस्तुत या जहां इनपुट डेटा से आता हो जाता है दो धाराओं, उत्पादन के लिए इनपुट के लिए एक और अन्य, नदियों सार प्रदान करता है।

तो स्कैनफ़ & printf क्या कर रहे हैं बस किसी भी स्ट्रीम से बाइट्स (या उपभोग बाइट्स) जोड़ रहे हैं।

+0

यह उच्च स्तरीय अमूर्त है। मैं यह जानना चाहता हूं कि ये स्ट्रीम हार्डवेयर के साथ कैसे काम करती हैं और ओएस कैसे सभी डेटा प्रबंधित करता है। – jetru

1

मेरी OS पर मैं scanf और printf के साथ काम कर रहा हूँ कार्यों getch पर आधारित होते हैं() चींटी putch()।

+0

वाह वह कुछ था। जब एकल क्लाइंट कनेक्ट होता था तब मैं यूआरटी से टीसीपी/आईपी तक आउटपुट बदलने में कामयाब रहा। यह एम्बेडेड सिस्टम के लिए सरल गैर प्रीपेप्टिव सहकारी माइक्रोक्रोनल था। –

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