2012-06-25 25 views
5

इस C कार्यक्रमसिस्टम() के आउटपुट को किसी फ़ाइल में रीडायरेक्ट कैसे करें?

#include <stdio.h> 
#include <fcntl.h> 
int main() 
{ 
    int file = open("Result", O_CREAT|O_WRONLY, S_IRWXU); 

    dup2(stdout, file); 
    system("ls -l"); 

    return 0; 
} 

में मैं एक फाइल करने के लिए system() के उत्पादन में पुनर्निर्देशित करने के लिए कोशिश कर रहा हूँ, उस के लिए मैं dup2 का इस्तेमाल किया है लेकिन यह काम नहीं कर रहा है।

क्या इस कोड साथ गलत क्या है?
और, कृपया मुझे बताओ अगर वहाँ इस करने के लिए कोई बेहतर तरीका है? (टर्मिनल पर > का उपयोग किए बिना)

+3

क्यों सिर्फ '>' 'system' आदेश में पुनर्निर्देशन का उपयोग नहीं करते? –

+0

'सिस्टम ("ls -l> परिणाम") का प्रयोग करें;' या अपना स्वयं का 'कांटा() '/' exec *()' संयोजन बनाएं। –

+1

'system' का उपयोग न करें। यह हमेशा गलत है। बिना किसी खोल के बच्चे की प्रक्रिया को चलाएं, या तो 'फोर्क' और 'execvp' या' posix_spawn' का उपयोग कर। –

उत्तर

4

stdout मानक आउटपुट स्ट्रीम का FILE * सूचक है। dup2 फ़ाइल डिस्क्रिप्टर की अपेक्षा करता है, आपने पैरामीटर ऑर्डर को गड़बड़ कर दिया है। उपयोग

dup2(file, 1); 

बजाय।

बेहतर तरह से करने-इस भाग पर

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

system("ls -l > Result"); 

तरह यह करने के लिए शेल कमांड के निर्माण के लिए है लेकिन आप के लिए है सावधान रहना फ़ाइलनाम (परिणाम) के रूप में उपयोगकर्ता 'Result; rm -rf /*' फ़ाइल नाम के रूप में की तरह कुछ आपूर्ति कर सकते हैं उपयोगकर्ता इनपुट से आता है।

system("/bin/ls -l > Result"); 
+1

मैंने आपके उदाहरण में एलएस के लिए एक पूर्ण पथ शामिल करने के लिए अपनी पोस्ट संपादित की। – Wug

+0

वापस संपादित किया गया क्योंकि ओपी 'ls' 'चलाता है और यह सिस्टम कॉल का अर्थ बदल देगा। प्रश्न पूर्ण या सापेक्ष पथ से भी असंबंधित है। मुझे लगता है कि अगर वह अपने जवाब को संशोधित करना चाहते हैं तो @unkulunkulu से पूछना बेहतर होगा। – Andomar

+0

@Andomar, वास्तव में, मैंने संपादन स्वीकार कर लिया है, लेकिन वैसे भी, आपके दोनों बिंदु मान्य हैं, मुझे कोई फर्क नहीं पड़ता :) Wug, सुझाव के लिए धन्यवाद, यह वैसे भी टिप्पणियों में देखा जाएगा। – unkulunkulu

2

आप वापस आ FILE * से popen() पुस्तकालय समारोह का उपयोग करें और डेटा का हिस्सा पढ़ना चाहिए:

इसके अलावा, सुरक्षा के विषय पर, आप के रूप में टिप्पणी में सुझाव दिया ls करने के लिए पूरा पथ निर्दिष्ट पर विचार करना चाहिए और उन्हें जो भी आउटपुट फ़ाइल पसंद है उसे लिखें।

Reference

4

सरल बात वास्तव में > उपयोग करने के लिए है:

#include <stdio.h> 
int main() 
{ 
    system("ls -l > /some/file"); 

    return 0; 
} 

एक वैकल्पिक popen()

#include <stdio.h> 
    #include <stdlib.h> 
    main() 
    { 
      char *cmd = "ls -l"; 
      char buf[BUFSIZ]; 
      FILE *ptr, *file; 

      file = fopen("/some/file", "w"); 
      if (!file) abort(); 
      if ((ptr = popen(cmd, "r")) != NULL) { 
        while (fgets(buf, BUFSIZ, ptr) != NULL) 
          fprintf(file, "%s", buf); 
        pclose(ptr); 
      } 
      fclose(file); 
      return 0; 
    } 
0

उपयोग dup बजाय dup2 की तर्ज पर कुछ प्रयोग कर रहा है,। dup एक उपनाम फ़ाइल डिस्क्रिप्टर बनाता है, जो मान हमेशा सबसे छोटा उपलब्ध फ़ाइल डिस्क्रिप्टर होना चाहिए।

new_fd = dup(file); - इस बयान file में मूल्य 3 (क्योंकि stdin0 है, stdout1 है और stderr2 है) होने जा सकता है।इसलिए new_fd4

यदि आप stdout को फ़ाइल में रीडायरेक्ट करना चाहते हैं। फिर नीचे के रूप में करते हैं।

close(stdout); 
new_fd = dup(file); 

अब dup क्योंकि हम बंद कर दिया stdout तो खोला फ़ाइल वर्णनकर्ता 0,2,3 कर रहे हैं और 1 छोटे उपलब्ध फ़ाइल की जानकारी देता है file वर्णनकर्ता के लिए उपनाम के रूप में 1 वापस आ जाएगी।

आप dup2 साधनों का उपयोग कर रहे हैं, dup2(file,1); - पसंद करते हैं इस

+0

'dup2()' के बजाय 'dup()' का उपयोग करना _only_ है यदि आपको परवाह नहीं है कि डुप्लिकेट कहां रखा गया है। यदि आप परवाह करते हैं, तो 'dup2() 'का उपयोग करें - यह इसका स्पष्ट उद्देश्य है! यदि इसके बजाय आप बस सर्वश्रेष्ठ के लिए आशा करते हैं, क्योंकि यह उत्तर करता है, तो यह एक दिन तक ठीक काम करेगा जब तक पैटर्न पैटर्न टूट जाए और आपको कोई विचार नहीं होगा कि यह क्यों विफल रहता है। जो कुछ देर रात की डीबग सत्रों के लिए बनाते हैं, जो इसे शुरुआत से ही सही तरीके से कर सकते थे। – mah