C++

2012-10-24 17 views
5

में बाहरी प्रोग्राम से stderr और stdout पकड़ें मैं एक प्रोग्राम लिखने की कोशिश कर रहा हूं जो बाहरी प्रोग्राम चलाता है।C++

मुझे पता है कि मैं stdout पकड़ कर सकते हैं, और मैं stdout और एक साथ stderr पकड़ कर सकते हैं, लेकिन सवाल मैं stderr और stdout अलग पकड़ कर सकते हैं कर रहा है?

मेरा मतलब है उदाहरण के लिए stderr परिवर्तनीय STDERR और stdout परिवर्तनीय STDOUT में। मेरा मतलब है कि मैं उन्हें अलग करना चाहता हूं।

इसके अलावा मुझे एक चर में बाहरी प्रोग्राम के निकास कोड की आवश्यकता है।

+3

क्या ओएस? और उन्हें एक साथ पकड़ने के लिए आप क्या जानते हैं? – ybungalobill

+0

मैं उबंटू का उपयोग कर रहा हूं और मुझे पता है कि मैं 2> और 1 का उपयोग कर सकता हूं। लेकिन मैं उन्हें अलग करना चाहता हूं। धन्यवाद –

+0

इस उत्तर को देखें: http://stackoverflow.com/a/12839498/1741542 –

उत्तर

2

विंडोज़ पर आपको STARTUPINFO को CreateProcess के लिए स्टैंडअर्ट स्ट्रीम पकड़ने के लिए भरना होगा, और आप समाप्ति स्थिति प्राप्त करने के लिए GetExitCodeProcess फ़ंक्शन का उपयोग कर सकते हैं। एक उदाहरण है कि कैसे माता पिता प्रक्रिया http://msdn.microsoft.com/en-us/library/windows/desktop/ms682499.aspx

लिनक्स-जैसा ओएस आप शायद fork बजाय execve उपयोग करना चाहते हैं पर में standart धाराओं रीडायरेक्ट करने के लिए नहीं है, और एक काँटेदार प्रक्रिया के साथ काम कर एक और कहानी है।

विंडोज और लिनक्स रीडायरेक्टिंग स्ट्रीम में सामान्य दृष्टिकोण है - आपको कई पाइप (प्रत्येक स्ट्रीम के लिए एक) बनाना होगा और बाल प्रक्रिया धाराओं को उस पाइप में पुनर्निर्देशित करना होगा, और मूल प्रक्रिया उस पाइप से डेटा पढ़ सकती है। लिनक्स के लिए

नमूना कोड:

int fd[2]; 

if (pipe(fd) == -1) { 
    perror("pipe"); 
    exit(EXIT_FAILURE); 
} 

pid_t cpid = fork(); 
if (cpid == -1) { 
    perror("fork"); 
    exit(EXIT_FAILURE); 
} 

if (cpid == 0) { // child 
    dup2(fd[1], STDERR_FILENO); 
    fprintf(stderr, "Hello, World!\n"); 
    exit(EXIT_SUCCESS); 
} else { // parent 
    char ch; 
    while (read(fd[0], &ch, 1) > 0) 
     printf("%c", ch); 
    exit(EXIT_SUCCESS); 
} 

संपादित करें: आप किसी अन्य प्रोग्राम से नदियों को पकड़ने के लिए की जरूरत है, एक ही stragey के रूप में ऊपर, पहले fork, दूसरे का उपयोग करें - उपयोग पाइप (ऊपर कोड के रूप में)

int status; 
if (waitpid(cpid, &status, 0) < 0) { 
    perror("waitpid"); 
    exit(EXIT_FAILURE); 
} 

आप आदमी पृष्ठों ०१२३०३८०९५८९ में और अधिक जानकारी प्राप्त कर सकते हैं: है, तो execve बच्चे की प्रक्रिया में एक और progrram और इस कोड को माता पिता प्रक्रिया में एक निष्पादन अंत तक प्रतीक्षा करें और एक वापसी कोड को पकड़ने के लिए उपयोग करें, dup2 और waitpid