दिलचस्प पोस्ट
buildTypes को groovy.lang.Closure पर लागू नहीं किया जा सकता Google मानचित्र से एक पॉलीलाइन प्राप्त करें V3 जावास्क्रिप्ट से एक्सीलरोमीटर / जीरोस्कोप डेटा तक कैसे पहुंचें? क्या आपके पास एक <option> element में एकाधिक पंक्तियां हो सकती हैं? क्या हमें आईई 6 का समर्थन करना चाहिए? जावा संकलित वर्गों में डॉलर के संकेत होते हैं जावा में सरल HTTP सर्वर जावा एसई एपीआई का उपयोग कर क्या हमेशा सी में शून्य है? एंड्रॉइड देव में स्टेटस बार में कौन से अधिसूचनाएं सक्रिय हैं, यह कैसे जांचें? विंडोज़ 7 टास्कबार में एक जावा एप्लिकेशन को लगा रहा है प्रति समूह पंक्तियों की संख्या के आधार पर सबसेट डेटा फ्रेम पायथन फ़ंक्शंस रिटर्न कोई भी रिटर्न स्टेटमेंट नहीं जावा एनआईओ फ़ाइलचैनल बनाम फाइलऑप्टस्ट्रस्ट प्रदर्शन / उपयोगिता एनोटेशन के साथ जावा पहलू-उन्मुख प्रोग्रामिंग क्या asp.net MVC में अनुप्रयोग चर है?

बफ़र या फ़ाइल में exec आउटपुट को पुन: निर्देशित करना

मैं एक सी प्रोग्राम लिख रहा हूँ, जहां मैं fork() , exec() , और wait() मैं इसे फ़ाइल या बफर में लिखने के लिए exec_ed प्रोग्राम का आउटपुट लेना चाहता हूं।

उदाहरण के लिए, यदि I exec ls तो मैं file1 file2 etc को बफर / फाइल में लिखना चाहता हूं। मुझे नहीं लगता कि stdout को पढ़ने का एक तरीका है, तो क्या इसका मतलब है कि मुझे एक पाइप का उपयोग करना है? क्या यहां कोई सामान्य प्रक्रिया है जो मुझे नहीं मिल पाई है?

Solutions Collecting From Web of "बफ़र या फ़ाइल में exec आउटपुट को पुन: निर्देशित करना"

आउटपुट को अन्य फाइल में भेजने के लिए (मैं महत्वपूर्ण विवरण पर ध्यान केंद्रित करने के लिए त्रुटि की जांच छोड़ रहा हूं):

 if (fork() == 0) { // child int fd = open(file, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR); dup2(fd, 1); // make stdout go to file dup2(fd, 2); // make stderr go to file - you may choose to not do this // or perhaps send stderr to another file close(fd); // fd no longer needed - the dup'ed handles are sufficient exec(...); } 

पाइप को आउटपुट भेजने के लिए ताकि आप आउटपुट को बफर में पढ़ सकें:

 int pipefd[2]; pipe(pipefd); if (fork() == 0) { close(pipefd[0]); // close reading end in the child dup2(pipefd[1], 1); // send stdout to the pipe dup2(pipefd[1], 2); // send stderr to the pipe close(pipefd[1]); // this descriptor is no longer needed exec(...); } else { // parent char buffer[1024]; close(pipefd[1]); // close the write end of the pipe in the parent while (read(pipefd[0], buffer, sizeof(buffer)) != 0) { } } 

आपको यह तय करने की आवश्यकता है कि आप क्या करना चाहते हैं – और अधिमानतः इसे थोड़ा अधिक स्पष्ट रूप से समझाएं

विकल्प 1: फ़ाइल

अगर आप जानते हैं कि आप किस निष्पादित कमांड के आउटपुट को जाने के लिए चाहते हैं, तो:

  1. सुनिश्चित करें कि माता-पिता और बच्चे नाम पर सहमत होते हैं (माता-पिता फोरिंग से पहले का नाम तय करते हैं)
  2. अभिभावक कांटे – आपके पास दो प्रक्रियाएं हैं
  3. बाल चीजों को पुनर्गठन करता है ताकि फाइल डिस्क्रिप्टर 1 (मानक आउटपुट) फ़ाइल को जाता है
  4. आमतौर पर, आप अकेले मानक त्रुटि छोड़ सकते हैं; आप / dev / null से मानक इनपुट को रीडायरेक्ट कर सकते हैं
  5. बच्चा तब प्रासंगिक आदेश चलाता है; कहा कमांड चलाता है और किसी भी मानक आउटपुट फाइल को जाता है (यह मूल शेल I / O redirection है)।
  6. निष्पादित प्रक्रिया तब समाप्त हो जाती है
  7. इस बीच, मूल प्रक्रिया दो मुख्य रणनीतियों में से एक को अपनाने के लिए कर सकती है:
    • पढ़ने के लिए फ़ाइल खोलें, और एक ईओएफ पहुंचने तक पढ़ना जारी रखें। इसके बाद यह जांचने की जरूरत है कि बच्चा मर गया है (इसलिए वहां पढ़ने के लिए कोई और डाटा नहीं होगा), या बच्चे के अधिक इनपुट की प्रतीक्षा करने में लटकाए।
    • बच्चे को मरने की प्रतीक्षा करें और फिर पढ़ने के लिए फाइल खोलें।
    • पहले का यह फायदा यह है कि माता पिता अपने कुछ काम कर सकते हैं, जबकि बच्चे भी चल रहा है; दूसरे का लाभ यह है कि आपको आई / ओ सिस्टम (बार-बार पिछला ईओएफ पढ़ना) के साथ नहीं करना पड़ता है

विकल्प 2: पाइप

यदि आप चाहते हैं कि माता-पिता बच्चे से आउटपुट को पढ़ने के लिए, तो बच्चे को उसके आउटपुट को माता-पिता को वापस पाइप करने की व्यवस्था करें।

  1. यह आसान तरीका करने के लिए popen () का उपयोग करें यह प्रक्रिया को चलाएगा और आउटपुट आपके मूल प्रक्रिया में भेज देगा। ध्यान दें कि माता पिता को सक्रिय होना चाहिए, जबकि बच्चे उत्पादन को पैदा कर रहे हैं क्योंकि पाइप के पास एक छोटा बफर आकार (अक्सर 4-5 KB) होता है और अगर बच्चा माता-पिता को पढ़ नहीं रहा है, तो उससे अधिक डेटा जनरेट करता है, तब तक बच्चे ब्लॉक नहीं करेंगे अभिभावक पढ़ता है अगर माता-पिता बच्चे की मृत्यु के लिए इंतजार कर रहे हैं, तो आपके पास एक गतिरोध है
  2. इसे कठिन तरीके से करने के लिए पाइप () आदि का उपयोग करें जनक कॉल पाइप (), फिर कांटा बच्चा नलसाजी को बाहर कर देता है ताकि पाइप का लिखना अंत इसकी मानक आउटपुट हो, और यह सुनिश्चित करता है कि पाइप से संबंधित अन्य सभी फाइल डिस्क्रिप्टर्स बंद हो जाएंगे। यह अच्छी तरह से dup2 () सिस्टम कॉल का उपयोग कर सकता है। यह तब आवश्यक प्रक्रिया को निष्पादित करता है, जो पाइप से इसकी मानक आउटपुट भेजता है।
  3. इस बीच, माता-पिता भी पाइप के अवांछित छोर को बंद कर देते हैं, और फिर पढ़ने शुरू करते हैं। जब यह पाइप पर ईओएफ हो जाता है, तो यह जानता है कि बच्चे ने पूरा किया है और पाइप बंद कर दिया है; यह पाइप के अपने समापन को भी बंद कर सकता है

चूंकि आप ऐसा दिखते हैं कि आप इसका उपयोग लिनक्स / साइगविन वातावरण में कर रहे हैं, आप पॉपेन का उपयोग करना चाहते हैं। यह एक फ़ाइल खोलने जैसा है, केवल आप निष्पादित कार्यक्रम stdout प्राप्त करेंगे, ताकि आप अपने सामान्य fscanf , fread आदि का उपयोग कर सकें।

dup2(2) बाद, फ़ाइल की एफडी को dup2(2) के एफडी में डुप्लिकेट करने के लिए dup2(2) का उपयोग करें, फिर exec