सी . में पाइप सिस्टम कॉल

Pipe System Call C



पाइप() एक Linux सिस्टम फ़ंक्शन है। NS पाइप() सिस्टम फ़ंक्शन का उपयोग फ़ाइल डिस्क्रिप्टर को खोलने के लिए किया जाता है, जो विभिन्न लिनक्स प्रक्रियाओं के बीच संचार करने के लिए उपयोग किया जाता है। संक्षेप में, पाइप() लिनक्स में इंटर-प्रोसेस संचार के लिए फ़ंक्शन का उपयोग किया जाता है। इस लेख में, मैं आपको दिखाने जा रहा हूं कि लिनक्स में पाइप () सिस्टम फ़ंक्शन का उपयोग कैसे करें। तो चलो शुरू हो जाओ।

का सिंटैक्स पाइप() समारोह है:







NSपाइप(NSपाइपफड[2]);

यहां, पाइप () फ़ंक्शन इंटर-प्रोसेस संचार के लिए एक यूनिडायरेक्शनल डेटा चैनल बनाता है। आप एक में गुजरते हैं NS (पूर्णांक) प्रकार सरणी पाइपफड फ़ंक्शन पाइप () में 2 सरणी तत्व शामिल हैं। फिर पाइप () फ़ंक्शन में दो फ़ाइल डिस्क्रिप्टर बनाता है पाइपफड सरणी।



का पहला तत्व पाइपफड सरणी, पाइपएफडी [0] पाइप से डेटा पढ़ने के लिए प्रयोग किया जाता है।



का दूसरा तत्व पाइपफड सरणी, पाइपएफडी[1] पाइप में डेटा लिखने के लिए उपयोग किया जाता है।





सफल होने पर, पाइप () फ़ंक्शन 0 देता है। यदि पाइप आरंभीकरण के दौरान कोई त्रुटि होती है, तो पाइप () फ़ंक्शन -1 देता है।

पाइप () फ़ंक्शन को हेडर में परिभाषित किया गया है unistd.h . अपने सी प्रोग्राम में पाइप () फ़ंक्शन का उपयोग करने के लिए, आपको हेडर शामिल करना होगा unistd.h निम्नलिखित नुसार:



#शामिल

पाइप () सिस्टम फ़ंक्शन के बारे में अधिक जानकारी के लिए, निम्न कमांड के साथ पाइप () के मैन पेज की जाँच करें:

$ आदमी2पाइप
पाइप का मैन पेज().

उदाहरण 1:

पहले उदाहरण के लिए, एक नई C स्रोत फ़ाइल बनाएँ 1_पाइप.सी और कोड की निम्नलिखित पंक्तियों में टाइप करें।

#शामिल
#शामिल
#शामिल

NSमुख्य(शून्य) {
NSपाइपफड्स[2];

अगर(पाइप(पाइपफड्स) == -1) {
आतंक ('पाइप');
बाहर जाएं (EXIT_FAILURE);
}

printf ('फाइल डिस्क्रिप्टर मान पढ़ें: %dएन',पाइपफड्स[0]);
printf ('फाइल डिस्क्रिप्टर मान लिखें:%dएन',पाइपफड्स[1]);

वापसीEXIT_SUCCESS;
}

यहां, मैंने पाइप की हेडर फ़ाइल शामिल की है () unistd.h पहले निम्न पंक्ति के साथ।

#शामिल

फिर, में मुख्य() समारोह, मैंने परिभाषित किया पाइपफड्स निम्न पंक्ति के साथ दो तत्व पूर्णांक सरणी।

NSपाइपफड्स[2];

फिर, मैंने फ़ाइल डिस्क्रिप्टर सरणी को प्रारंभ करने के लिए पाइप() फ़ंक्शन चलाया पाइपफड्स निम्नलिखित नुसार।

पाइप(पाइपफड्स)

मैंने पाइप () फ़ंक्शन के रिटर्न मान का उपयोग करके त्रुटियों की भी जाँच की। मैंने इस्तेमाल किया बाहर जाएं() यदि पाइप फ़ंक्शन विफल हो जाता है तो प्रोग्राम को टर्मिनल पर कार्य करें।

अगर(पाइप(पाइपफड्स) == -1) {
आतंक ('पाइप');
बाहर जाएं (EXIT_FAILURE);
}

फिर, मैंने पाइप फ़ाइल डिस्क्रिप्टर को पढ़ने और लिखने के मूल्य को मुद्रित किया पाइपफड्स [0] तथा पाइपफड्स[1] क्रमश।

printf ('फाइल डिस्क्रिप्टर मान पढ़ें: %dएन',पाइपफड्स[0]);
printf ('फाइल डिस्क्रिप्टर मान लिखें:%dएन',पाइपफड्स[1]);

यदि आप प्रोग्राम चलाते हैं, तो आपको निम्न आउटपुट देखना चाहिए। जैसा कि आप देख सकते हैं, रीड पाइप फ़ाइल डिस्क्रिप्टर का मूल्य पाइपफड्स [0] है 3 और पाइप फाइल डिस्क्रिप्टर लिखें पाइपफड्स[1] है 4 .

उदाहरण 2:

एक और सी स्रोत फ़ाइल बनाएँ 2_पाइप.सी और कोड की निम्नलिखित पंक्तियों में टाइप करें।

#शामिल
#शामिल
#शामिल
#शामिल

NSमुख्य(शून्य) {
NSपाइपफड्स[2];
charबफर[5];

अगर(पाइप(पाइपफड्स) == -1) {
आतंक ('पाइप');
बाहर जाएं (EXIT_FAILURE);
}

char *पिन= '4128' 0';

printf ('पाइप पर पिन लिखा जा रहा है...एन');
लिखो(पाइपफड्स[1],पिन, 5);
printf ('किया हुआ।एनएन');

printf ('पाइप से पिन पढ़ रहा है...एन');
पढ़ना(पाइपफड्स[0],बफर, 5);
printf ('किया हुआ।एनएन');

printf ('पाइप से पिन: %sएन',बफर);

वापसीEXIT_SUCCESS;
}

यह प्रोग्राम मूल रूप से आपको दिखाता है कि पाइप को कैसे लिखना है और पाइप से आपके द्वारा लिखे गए डेटा को पढ़ना है।

यहाँ, मैंने एक 4-वर्ण का पिन कोड a . में संगृहीत किया है char सरणी। सरणी की लंबाई 5 है (नल वर्ण 0 सहित)।

char *पिन= '4128' 0';

प्रत्येक ASCII वर्ण C में आकार में 1 बाइट है। इसलिए, पाइप के माध्यम से 4 अंकों का पिन भेजने के लिए, आपको पाइप में 5 बाइट्स (4 + 1 NULL वर्ण) डेटा लिखना होगा।

डेटा के 5 बाइट्स लिखने के लिए ( पिन ) पाइप में, मैंने इस्तेमाल किया लिखो() राइट पाइप फ़ाइल डिस्क्रिप्टर का उपयोग करके कार्य करें पाइपफड्स[1] निम्नलिखित नुसार।

लिखो(पाइपफड्स[1],पिन, 5);

अब जब मेरे पास पाइप में कुछ डेटा है, तो मैं इसे पाइप का उपयोग करके पढ़ सकता हूं पढ़ना() रीड पाइप फ़ाइल डिस्क्रिप्टर पर कार्य करें पाइपफड्स [0] . जैसा कि मैंने 5 बाइट्स डेटा लिखा है ( पिन ) पाइप में, मैं पाइप से डेटा के 5 बाइट्स भी पढ़ूंगा। पढ़ा गया डेटा में संग्रहीत किया जाएगा बफर चरित्र सरणी। जैसा कि मैं पाइप से डेटा के 5 बाइट्स पढ़ रहा हूँ, the बफर वर्ण सरणी कम से कम 5 बाइट लंबी होनी चाहिए।

मैंने परिभाषित किया है बफर की शुरुआत में वर्ण सरणी मुख्य() समारोह।

charबफर[5];

अब, मैं पाइप से पिन पढ़ सकता हूं और इसे में स्टोर कर सकता हूं बफर निम्नलिखित पंक्ति के साथ सरणी।

पढ़ना(पाइपफड्स[0],बफर, 5);

अब जब मैंने पाइप से पिन पढ़ लिया है, तो मैं इसका उपयोग करके प्रिंट कर सकता हूं प्रिंटफ () हमेशा की तरह कार्य करें।

printf ('पाइप से पिन: %sएन',बफर);

एक बार जब मैं प्रोग्राम चलाता हूं, तो सही आउटपुट प्रदर्शित होता है जैसा आप देख सकते हैं।

उदाहरण 3:

एक नई सी स्रोत फ़ाइल बनाएँ 3_पाइप.सी कोड की निम्नलिखित पंक्तियों में टाइप करें।

#शामिल
#शामिल
#शामिल
#शामिल
#शामिल
NSमुख्य(शून्य) {
NSपाइपफड्स[2];
char *पिन;
charबफर[5];

अगर(पाइप(पाइपफड्स) == -1) {
आतंक ('पाइप');
बाहर जाएं (EXIT_FAILURE);
}

pid_t pid=कांटा();

अगर(पीआईडी== 0) { // बच्चे की प्रक्रिया में
पिन= '4821' 0'; // पिन भेजने के लिए
बंद करे(पाइपफड्स[0]); // बंद पढ़ें fd
लिखो(पाइपफड्स[1],पिन, 5); // पाइप को पिन लिखें

printf ('बच्चे में पिन जनरेट करना और माता-पिता को भेजना...एन');
नींद(2); // जानबूझकर देरी
बाहर जाएं (EXIT_SUCCESS);
}

अगर(पीआईडी> 0) { // मुख्य प्रक्रिया में
रुको(शून्य); // बच्चे की प्रक्रिया समाप्त होने की प्रतीक्षा करें
बंद करे(पाइपफड्स[1]); // बंद लिखें fd
पढ़ना(पाइपफड्स[0],बफर, 5); // पाइप से पिन पढ़ें
बंद करे(पाइपफड्स[0]); // बंद पढ़ें fd

printf ('माता-पिता को पिन'%s' प्राप्त हुआएन',बफर);
}

वापसीEXIT_SUCCESS;
}

इस उदाहरण में, मैंने आपको अंतर-प्रक्रिया संचार के लिए पाइप का उपयोग करने का तरीका दिखाया। मैंने पाइप का उपयोग करके चाइल्ड प्रोसेस से पैरेंट प्रोसेस में एक पिन भेजा है। फिर मूल प्रक्रिया में पाइप से पिन पढ़ें और इसे मूल प्रक्रिया से प्रिंट करें।

सबसे पहले, मैंने कांटा () फ़ंक्शन का उपयोग करके एक बाल प्रक्रिया बनाई है।

pid_t pid=कांटा();

फिर, बाल प्रक्रिया में ( पिड == 0 ), मैंने का उपयोग करके पाइप को पिन लिखा लिखो() समारोह।

लिखो(पाइपफड्स[1],पिन, 5);

चाइल्ड प्रोसेस से पाइप पर पिन लिखे जाने के बाद, पैरेंट प्रोसेस ( पीआईडी> 0 ) इसे का उपयोग करके पाइप से पढ़ें पढ़ना() समारोह।

पढ़ना(पाइपफड्स[0],बफर, 5);

फिर, मूल प्रक्रिया ने पिन का उपयोग करके प्रिंट किया प्रिंटफ () हमेशा की तरह कार्य करें।

printf ('माता-पिता को पिन'%s' प्राप्त हुआएन',बफर);

जैसा कि आप देख सकते हैं, प्रोग्राम चलाने से अपेक्षित परिणाम मिलते हैं।

उदाहरण 4:

एक नई सी स्रोत फ़ाइल बनाएँ 4_पाइप.सी कोड की निम्नलिखित पंक्तियों में टाइप करें।

#शामिल
#शामिल
#शामिल
#शामिल
#शामिल

#पिन परिभाषित करें_LENGTH 4
#पिन परिभाषित करें_WAIT_INTERVAL 2

शून्यपिन प्राप्त करें(charपिन[पिन_LENGTH+ 1]) {
सरांडो (गेटपीड() +गेटपीड());

पिन[0] = 49 + पंक्ति () % 7;

के लिये(NSमैं= 1;मैं<पिन_LENGTH;मैं++) {
पिन[मैं] = 48 + पंक्ति () % 7;
}

पिन[पिन_LENGTH] = ' 0';
}


NSमुख्य(शून्य) {
जबकि(1) {
NSपाइपफड्स[2];
charपिन[पिन_LENGTH+ 1];
charबफर[पिन_LENGTH+ 1];

पाइप(पाइपफड्स);

pid_t pid=कांटा();

अगर(पीआईडी== 0) {
पिन प्राप्त करें(पिन); // पिन जनरेट करें
बंद करे(पाइपफड्स[0]); // बंद पढ़ें fd
लिखो(पाइपफड्स[1],पिन,पिन_LENGTH+ 1); // पाइप को पिन लिखें

printf ('बच्चे में पिन जनरेट करना और माता-पिता को भेजना...एन');

नींद(PIN_WAIT_INTERVAL); // जानबूझकर पिन बनाने में देरी करना।

बाहर जाएं (EXIT_SUCCESS);
}

अगर(पीआईडी> 0) {
रुको(शून्य); // बच्चे के खत्म होने का इंतजार

बंद करे(पाइपफड्स[1]); // बंद लिखें fd
पढ़ना(पाइपफड्स[0],बफर,पिन_LENGTH+ 1); // पाइप से पिन पढ़ें
बंद करे(पाइपफड्स[0]); // बंद पढ़ें fd
printf ('माता-पिता को बच्चे से पिन '%s' प्राप्त हुआ।एनएन',बफर);
}
}

वापसीEXIT_SUCCESS;
}

यह उदाहरण वैसा ही है जैसा उदाहरण 3 . अंतर केवल इतना है कि यह प्रोग्राम लगातार चाइल्ड प्रोसेस बनाता है, चाइल्ड प्रोसेस में एक पिन जेनरेट करता है और एक पाइप का उपयोग करके पिन को पैरेंट प्रोसेस में भेजता है।

मूल प्रक्रिया तब पाइप से पिन पढ़ती है और उसे प्रिंट करती है।

यह प्रोग्राम प्रत्येक PIN_WAIT_INTERVAL सेकंड में एक नया PIN_LENGTH पिन जनरेट करता है।

जैसा कि आप देख सकते हैं, कार्यक्रम अपेक्षा के अनुरूप काम करता है।

आप केवल दबाकर प्रोग्राम को रोक सकते हैं + सी .

तो, इस प्रकार आप सी प्रोग्रामिंग भाषा में पाइप () सिस्टम कॉल का उपयोग करते हैं। इस लेख को पढ़ने के लिए धन्यवाद।