C . में Linux Popen सिस्टम कॉल

C Mem Linux Popen Sistama Kola



' पॉपन () फ़ंक्शन स्ट्रिंग के कमांड द्वारा दिए गए कमांड को पूरा करेगा। फ़ंक्शन को एक पॉइंटर को एक स्ट्रीम में वापस करना चाहिए जिसका उपयोग पाइप को पढ़ने या लिखने के लिए किया जाता है, जबकि कॉलिंग एप्लिकेशन और निष्पादित कमांड के बीच एक पाइप भी बनाता है। Popen फ़ंक्शन I/O फ़ंक्शन की मानक लाइब्रेरी में उपलब्ध है और टर्मिनल कमांड चलाने के लिए दूसरी प्रक्रिया को जन्म देता है। पॉपन () का खुला चरण fopen () फ़ंक्शन में खुले चरण के समान है। पॉपन () फ़ंक्शन फोर्किंग, पाइप का निर्माण और शेल को निष्पादित करके एक प्रक्रिया शुरू करता है। चूंकि एक पाइप डिफ़ॉल्ट रूप से यूनिडायरेक्शनल है; नतीजतन, स्ट्रीम या तो केवल-पढ़ने के लिए या केवल-लिखने के लिए है। पॉपन () फ़ंक्शन के सफल निष्पादन पर, एक खुली धारा प्राप्त होती है जिसका उपयोग पाइप को पढ़ने और लिखने के लिए किया जाता है।

उदाहरण 1

निम्नलिखित उदाहरण प्रोग्राम के साथ, हम पॉपन सिस्टम कॉल का उपयोग करके वर्तमान निर्देशिका या फ़ोल्डर में मौजूद फाइलों को पढ़ेंगे। सबसे पहले, हमारे पास सी मानक पुस्तकालय की stdio.h शीर्षलेख फ़ाइल इनपुट है। फिर, हमारे पास एक प्रोग्राम इंट मेन () फंक्शन है जहाँ हमने पॉपन फंक्शन को तैनात किया है। इससे पहले, हमने 'FILE' वर्ग से पॉइंटर वेरिएबल 'फाइलओपन' की स्थापना की। फ़ाइल का सूचक चर अगले बाइट को पढ़ने या लिखने के लिए इंगित करता है।







उसके बाद, हमने पढ़ने के लिए कैरेक्टर की लिमिट वैल्यू असाइन की। चर 'फाइलओपन' ने तब 'पॉपेन' फ़ंक्शन को लागू किया। 'पॉपेन' फ़ंक्शन लिनक्स की 'ls -l' कमांड लेता है, जो वर्तमान निर्देशिका की सभी फाइलों को सूचीबद्ध करेगा। इसके अलावा, हमारे पास पॉपन फ़ंक्शन में 'आर' पैरामीटर इनपुट है, जो रीड मोड को इंगित करता है।



यहां, हमने पॉपन फ़ंक्शन का उपयोग करके फ़ाइलों को पढ़ने की प्रक्रिया को पाइप किया है। अगला, हमने बनाए गए पाइप को लूप के साथ संसाधित किया। जबकि लूप fgets विधियों का उपयोग करता है, जो तर्क 'लाइन', 'लाइन का आकार,' और 'फाइलओपन' लेता है। fgets ने पाइप की गई प्रक्रिया को पढ़ा और इसे स्ट्रिंग के '%s' प्रतीक में संग्रहीत किया। इस विशेष प्रतीक को 'लाइन' तर्क के साथ प्रिंटफ विधि के अंदर कहा जाता है। एक बार जब हम संसाधित पाइप बना लेते हैं, तो pclosed फ़ंक्शन के साथ, पाइप की गई प्रक्रिया को नीचे दिए गए प्रोग्राम के अंत में परिनियोजित के रूप में बंद किया जा सकता है।



#शामिल करें


मुख्य प्रवेश बिंदु ( )

{

फ़ाइल * फ़ाइल खोलें;

चार लाइन [ 130 ] ;


फाइलओपन = पॉपन ( 'एलएस-एल' , 'आर' ) ;

जबकि ( fgets ( रेखा, आकार रेखा, FileOpen ) )

{

printf ( '%एस' , रेखा ) ;

}

बंद करो ( फ़ाइल खोलें ) ;

}





सी प्रोग्राम के पॉपन फंक्शन ने उपरोक्त प्रक्रिया को फोर्क किया और फिर पाइप बनाया। अब, हमने सी संकलन कमांड के साथ शेल में स्ट्रीम के संसाधित पाइप को निष्पादित किया है। आउटपुट ने 'होम' निर्देशिका में सभी फाइलों को सूचीबद्ध किया है क्योंकि हमने उस निर्देशिका में प्रोग्राम निष्पादित किया है।



उदाहरण 2

पिछले पॉपन प्रोग्राम में, हमारे पास पॉपन प्रोग्राम की कार्यक्षमता का एक सरल प्रदर्शन है जिसका उपयोग फाइलों को पढ़ने की स्ट्रीमिंग प्रक्रिया को पाइप करने के लिए किया जाता है। अब, हमने पॉपन फ़ंक्शन का एक और उदाहरण लिया है जहां हमने लेखन मोड के साथ प्रक्रिया को पाइप किया है। आइए मुख्य कार्य के साथ कार्यक्रम पर विचार करें। हमने मुख्य फ़ंक्शन के अंदर 'फ़ाइल' के रूप में फ़ाइल पॉइंटर वैरिएबल का निर्माण किया है। फ़ाइल पॉइंटर को पॉपन फ़ंक्शन के साथ तैनात किया गया है।

पॉपन फ़ंक्शन 'कैट' कमांड और राइट मोड के लिए 'डब्ल्यू' लेता है। यहां, प्रत्येक फ़ाइल तर्क को क्रमिक रूप से पढ़ा जाता है और कैट कमांड द्वारा मानक आउटपुट पर भेजा जाता है। लूप बॉडी में, हमने संख्यात्मक गणना मानों को मुद्रित करने के लिए fprintf फ़ंक्शन का उपयोग किया है क्योंकि हमने '%d' प्रतीक निर्दिष्ट किया है। फिर बंद, pclose सिस्टम कॉल के साथ पॉपन पाइप प्रक्रिया।

#शामिल करें


मुख्य प्रवेश बिंदु ( इंट argc, char ** अर्जीवी ) {

फ़ाइल * फ़ाइल = पॉपन ( 'बिल्ली' , 'में' ) ;

इंट एक्स = 0 ;


के लिये ( एक्स = 0 ;एक्स < 5 ;x++ ) {


एफप्रिंटफ ( फ़ाइल , 'माई काउंट = %d \एन ' , एक्स ) ;
}

बंद करो ( फ़ाइल ) ;

वापसी 0 ;

}

जब हमने ऊपर बनाई गई प्रक्रिया को निष्पादित किया, तो उसने निम्नलिखित तरीके से गिनती मूल्यों को मुद्रित किया।

उदाहरण 3

अब, हमारे पास एक और प्रोग्राम है जो एक प्रक्रिया के डेटा को दूसरी प्रक्रिया में स्थानांतरित करता है। हम इसे पॉपन फ़ंक्शन से पाइप के साथ करेंगे। हमने सी के मानक पुस्तकालयों का उपयोग करके कार्यक्रम को लागू किया है। फिर, हमारे पास एक कार्यक्रम को तैनात करने के लिए एक मुख्य मुख्य कार्य है। यहां, हमने 'बफर' तर्क के साथ स्प्रिंटफ फ़ंक्शन में स्ट्रिंग निर्दिष्ट की है। स्प्रिंटफ () फ़ंक्शन परिणाम को प्रॉम्प्ट पर भेजने के बजाय स्प्रिंटफ द्वारा प्रदान किए गए चार बफर पर रखता है।

उसके बाद, हमने 'रीड' वेरिएबल के अंदर पॉपन फंक्शन को कॉल किया। वहां, हमारे पास पॉपन फ़ंक्शन के अंदर दो प्रक्रियाएं हैं। 'wc -c' पहली प्रक्रिया है जिसका उपयोग प्रदान किए गए वर्णों को गिनने के लिए किया जाता है, और दूसरी प्रक्रिया 'w' है, जो इंगित करती है कि पाइप लेखन मोड में खुला है। उसके बाद, हमारे पास 'fwrite' फ़ंक्शन है जो डेटा लिखने के लिए पाइप का उपयोग करता है। डेटा 'wc' द्वारा प्राप्त किया जाएगा, फिर चरित्र को गिना और शेल में प्रदर्शित किया जाएगा।

#शामिल करें

#शामिल करें

#शामिल करें

#शामिल करें

मुख्य प्रवेश बिंदु ( )

{

फ़ाइल * पढ़ना ;

चार बफर [ पचास ] ;

स्प्रिंटफ ( बफर, 'लिनक्स सिस्टम कॉल' ) ;

पढ़ना =पॉपेन ( 'डब्ल्यूसी-सी' , 'में' ) ;

fwrite ( बफर, आकार ( चारो ) स्ट्रेलेन ( बफर ) , पढ़ना ) ;

बंद करो ( पढ़ना ) ;

}

प्रांप्ट में प्रदर्शित वर्ण '17' हैं क्योंकि ऊपर निर्दिष्ट स्ट्रिंग में '17' वर्ण हैं। 'wc -c' प्रक्रिया इन वर्णों को पढ़ती है और उन्हें आउटपुट के रूप में प्रिंट करती है।

उदाहरण 4

पॉपन का उपरोक्त उदाहरण डेटा को एक प्रक्रिया से दूसरी प्रक्रिया में भेजता है। यहां, हम एक प्रक्रिया से दूसरी प्रक्रिया में एक पाइप के माध्यम से डेटा प्राप्त करेंगे। कार्यक्रम का मुख्य कार्य बफर का निर्माण करना है, जो '50' मान लेता है। फिर, हमने वेरिएबल 'आर' बनाया, जहां पॉपन फ़ंक्शन ने प्रक्रिया बनाई। 'Ls' प्रक्रिया का उपयोग निर्देशिका की फ़ाइलों को सूचीबद्ध करने के लिए किया जाता है, और पाइप से डेटा पढ़ने के लिए 'r' प्रक्रिया का उपयोग किया जाता है। 'Ls' प्रक्रिया डेटा को पढ़ने के लिए 'r' प्रक्रिया में स्थानांतरित करती है। इसके बाद, हमारे पास फ़्रेड फ़ंक्शन होता है, जो डेटा को पढ़ता है और डेटा को बफर में संग्रहीत करता है। फिर, प्रिंट स्टेटमेंट बफर में संग्रहीत डेटा को प्रिंट करेगा।

#शामिल करें

#शामिल करें

#शामिल करें

#शामिल करें

मुख्य प्रवेश बिंदु ( )

{

फ़ाइल * आर;

चार बफर [ पचास ] ;


आर = पॉपन ( 'एलएस' , 'आर' ) ;

फ़्रेड ( बफर, 1 , 25 , आर ) ;


printf ( '%एस \एन ' , बफर ) ;

बंद करो ( आर ) ;

}

यहां मौजूदा फाइलों के केवल '50' अक्षर कार्यशील निर्देशिका से प्रदर्शित होते हैं। इसलिए, आउटपुट में केवल 50 वर्ण होंगे।

निष्कर्ष

हमने सी भाषा में लिनक्स पॉपन सिस्टम कॉल का विस्तृत प्रदर्शन दिया है। हमने चार उदाहरण लागू किए हैं जहां हमने पॉपन फ़ंक्शन को तैनात किया है। पॉपन फ़ंक्शन हमारे द्वारा निर्दिष्ट मोड के अनुसार पाइप स्ट्रीम लौटाता है। उदाहरणों में, हमने फ़ाइल हैंडलिंग फ़ंक्शंस fread और fwrite के साथ पढ़ने और लिखने दोनों मोड का उपयोग किया है। हमने पहले तर्क के रूप में पॉपन () फ़ंक्शन में प्रोग्राम के नाम का उपयोग किया है। दूसरा तर्क एक फ़ाइल 'आर' पढ़ने के रूप में या 'डब्ल्यू' लिखने के तरीके के रूप में है।