2009-03-22 3 views
20

मैं सिर्फ यह जानना चाहता हूं कि सी ++ में बाहरी कमांड निष्पादित करने का सबसे अच्छा तरीका कौन सा है और यदि कोई है तो मैं आउटपुट कैसे प्राप्त कर सकता हूं?मैं सी ++/लिनक्स में बाहरी कमांड कैसे निष्पादित कर सकता हूं?

संपादित करें: मुझे लगता है कि मुझे यह बताना था कि मैं इस दुनिया में एक नौसिखिया हूं, इसलिए मुझे लगता है कि मुझे एक कामकाजी उदाहरण की आवश्यकता होगी।

ls -la 

मुझे लगता है कि कैसे करते हो: उदाहरण के लिए मैं की तरह एक आदेश पर अमल करना चाहते हैं?

+0

@ मेहरदाद के लिंक को देखें, इसका उदाहरण ls =) – bayda

उत्तर

22

popen फ़ंक्शन का उपयोग करें।

उदाहरण (पूरा नहीं हुआ, उत्पादन गुणवत्ता कोड, कोई त्रुटि हैंडलिंग):

FILE* file = popen("ls", "r"); 
// use fscanf to read: 
char buffer[100]; 
fscanf(file, "%100s", buffer); 
pclose(file); 
+10

@Daniel यह उत्पादन कोड नहीं है। यह एक ऑनलाइन मंच पर एक उत्तर है जो पॉपिन फ़ंक्शन और उसके तर्कों का उच्च-स्तरीय विचार देने वाला है। उत्पादन कोड के रूप में सभी स्टैक ओवरफ़्लो उत्तरों के इलाज की आदत में कोई भी इससे अधिक गंभीर समस्याएं हैं। इसके अलावा, किसी भी बफर जिसमें संभावना ओवरफ्लो है, वह छुटकारा पाने की एक गंभीर सुरक्षा सुरक्षा कार्य नहीं है। एक विशिष्ट खतरे के मॉडल के बिना और यह जानकर कि क्या विश्वसनीय है और विशेष पर्यावरण में क्या नहीं है, कुछ सुरक्षा लागू है, सुरक्षा के बारे में चर्चा मूक है। –

+0

@ डैनियल मुझे लगता है कि आपकी पहली टिप्पणी ज्यादातर लोगों को भंग करने जा रही है। आप एक सीईआरटी पृष्ठ का लिंक क्यों नहीं देते हैं। मुझे यकीन है कि यह कहीं [सुरक्षित प्रोग्रामिंग नोट्स] में है (https://www.securecoding.cert.org/confluence/pages/viewpage.action?pageId=4063380)। मेहदाद भी अपना जवाब अपडेट कर सकते हैं। –

+0

@ डैनियल मैं आपको सुनता हूं। निश्चित रूप से, सभी संभावित गॉथस के बारे में एक और पूर्ण उत्तर चेतावनी एक बेहतर जवाब हो सकता है। आप कोड की तीन पंक्तियों में गॉथस के बारे में एक पुस्तक लिखने में सक्षम हो सकते हैं। हालांकि, यह स्पष्ट है कि इस प्रश्न के लिए जर्मन क्या है "पॉपन" और यह नहीं कि आप बाहरी प्रक्रिया के आउटपुट को आगे कैसे संसाधित करेंगे ... –

1

उपयोग प्रणाली ("ls -ला") समारोह

+0

मुझे नहीं पता कि यह क्यों डाउनवॉट किया गया था ... –

+1

यह सवाल का जवाब नहीं देता है। सिस्टम() कॉल से आउटपुट प्राप्त करने का कोई तरीका नहीं है। – greyfade

+0

यह आदमी काम करता है .. मैंने इसे devC++ IDE में कई बार उपयोग किया है .... – suresh

20

एक उदाहरण:

#include <stdio.h> 

int main() { 
    FILE * f = popen("ls -al", "r"); 
    if (f == 0) { 
     fprintf(stderr, "Could not execute\n"); 
     return 1; 
    } 
    const int BUFSIZE = 1000; 
    char buf[ BUFSIZE ]; 
    while(fgets(buf, BUFSIZE, f)) { 
     fprintf(stdout, "%s", buf ); 
    } 
    pclose(f); 
} 
+0

का जवाब वापस नहीं लौटाता है मुख्य के अंत में वापसी 0 भूल गया। और fgets में 1000 के बजाय आकार (buff) का उपयोग करें :) – bayda

+3

सी ++ को मुख्य के अंत में वापसी की आवश्यकता नहीं है। –

+0

सच है, लेकिन वापसी करना अच्छा लगता है, ताकि यह स्पष्ट हो कि प्रोग्राम से बाहर आने वाला क्या है। –

15

popen निश्चित रूप से वह काम करता है जिसे आप ढूंढ रहे हैं, लेकिन इसमें कुछ कमियां हैं:

  • यह आदेश आप को क्रियान्वित कर रहे हैं पर एक खोल invokes (जिसका अर्थ है कि आप किसी भी उपयोगकर्ता प्रदान की कमान तार untaint करने की जरूरत है)
  • यह केवल एक ही दिशा में काम करता है, या तो आप उपप्रक्रिया के लिए इनपुट प्रदान कर सकते हैं या आप इसके आउटपुट पढ़ सकते हैं।

आप तो एक उपप्रक्रिया आह्वान और इनपुट प्रदान और कब्जा उत्पादन चाहते हैं तो आप कुछ इस तरह करना होगा:

int Input[2], Output[2]; 

pipe(Input); 
pipe(Output); 

if(fork()) 
{ 
    // We're in the parent here. 
    // Close the reading end of the input pipe. 
    close(Input[ 0 ]); 
    // Close the writing end of the output pipe 
    close(Output[ 1 ]); 

    // Here we can interact with the subprocess. Write to the subprocesses stdin via Input[ 1 ], and read from the subprocesses stdout via Output[ 0 ]. 
    ... 
} 
else 
{ // We're in the child here. 
    close(Input[ 1 ]); 
    dup2(Input[ 0 ], STDIN_FILENO); 
    close(Output[ 0 ]); 
    dup2(Output[ 1 ], STDOUT_FILENO); 

    execlp("ls", "-la", NULL); 
} 
बेशक

, आप अन्य कार्यकारी से किसी के साथ execlp जगह ले सकता है उपयुक्त के रूप में कार्य करता है।