2011-06-30 13 views
6

लिनक्स/सी/पाइप के माध्यम से पिंग के वास्तविक समय उत्पादन कैप्चरिंग:लिनक्स पाइप: popen

मैं कैसे popen (या इसी तरह की प्रणाली कॉल) का उपयोग पिंग कमांड के उत्पादन पर कब्जा कर सकते हैं। वर्तमान में पॉपिंग तब तक प्रतीक्षा करेगी जब तक कि पिंग समाप्त न हो जाए। फिर आउटपुट एक साथ डंप किया जाएगा।

छद्म कोड:

fp= popen("ping x.x.x.x", "r"); 
while(!feof(pFp)) 
{ 
    if(fgets(fp ...) // <==currently the code blocks here until ping finishes in popen 
    { 
     printf(...real time ping output here); 
    } 
} 
+0

सी या सी ++? आपका कोड सी – ThiefMaster

+0

जैसा दिखता है आप शायद बफरिंग से पीड़ित हैं। अधिक नियंत्रण के लिए पाइप (2) का प्रयोग करें। – cdarke

+1

@cdarke: मदद नहीं करेगा। समस्या यह है कि पिंग अपने आउटपुट को बफर कर रहा है। मैं निश्चित रूप से यह पिंग में एक बग पर विचार करेंगे। यदि यह जानता है कि इसमें एक सेकंड तक (जब यह सोता है) के लिए कोई और आउटपुट नहीं होगा तो इसे सोने से पहले अपने आउटपुट को फ्लश करना चाहिए ... –

उत्तर

7

यह जब तक पिंग समाप्त हो गया है इंतज़ार कर नहीं है। इसके बजाय, पिंग तब तक प्रतीक्षा कर रहा है जब तक stdout बफर कुछ भी लिखने से पहले भर जाता है। इसमें से बचने के एकमात्र तरीके छद्म-ttys शामिल हैं। या तो आपको popen छोड़ना चाहिए और पिंग बाल प्रक्रिया को चलाने के लिए कोड लिखना चाहिए और संचार के लिए छद्म-टीटी का उपयोग करना चाहिए (यह गैर मानक लेकिन व्यापक रूप से उपलब्ध forkpty फ़ंक्शन के साथ आसान है) या आप एक छद्म प्रोग्राम लिख सकते हैं जो छद्म माध्यम से पिंग चलाता है आउटपुट को खाली और पकड़ लेते हैं, और इसे लिखते हैं से stdout बफर किए बिना।

+0

धन्यवाद, मैंने setvbuf (fp, nULL, _IONBF, 0) भी कोशिश की है। मुझे उम्मीद है कि बफरिंग अक्षम है, आउटपुट तुरंत उपलब्ध होगा। मैं समझ नहीं पा रहा हूं कि यह क्यों काम नहीं करता था। ऐसा लगता है कि आपको जो करना है वह करना है। – Jacob

+3

इससे मदद नहीं मिलेगी। जो कुछ करता है वह आपके * इनपुट बफर * पर बफरिंग अक्षम करता है। लेकिन समस्याग्रस्त बफरिंग अपने * आउटपुट बफर * में पिंग प्रोग्राम के अंदर है। उस पर आपका बिल्कुल नियंत्रण नहीं है। –

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