Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> C++

C++ में POSIX कमांड एक्जीक्यूट करना और आउटपुट प्राप्त करना


C++ में सिस्टम कमांड एक्जीक्यूट करने और उसका आउटपुट प्राप्त करने के लिए popen() (POSIX) का उपयोग करें। system() केवल एग्जिट कोड लौटाता है, आउटपुट नहीं।

विधि 1: popen() - आउटपुट पढ़ने के लिए

#include <iostream>
#include <cstdio>
#include <memory>
#include <string>
using namespace std;

string execCommand(const string &cmd) {
    const int bufferSize = 128;
    char buffer[bufferSize];
    string result;
    
    // "r" मोड: कमांड के stdout को पढ़ें
    unique_ptr<FILE, decltype(&pclose)> pipe(popen(cmd.c_str(), "r"), pclose);
    
    if (!pipe) {
        throw runtime_error("popen() failed!");
    }
    
    while (fgets(buffer, bufferSize, pipe.get()) != nullptr) {
        result += buffer;
    }
    
    return result;
}

int main() {
    try {
        // सिंपल कमांड
        cout << "=== echo command ===\n";
        cout << execCommand("echo 'Hello World'");
        
        // मैथ एक्सप्रेशन
        cout << "\n=== bc calculator ===\n";
        cout << execCommand("echo '22 / 7' | bc -l");
        
        // सिस्टम इन्फो
        cout << "\n=== System info ===\n";
        cout << execCommand("uname -a");
        
        // डिस्क उपयोग
        cout << "\n=== Disk usage ===\n";
        cout << execCommand("df -h /");
        
    } catch (const exception &e) {
        cerr << "Error: " << e.what() << endl;
    }
    
    return 0;
}

आउटपुट

=== echo command ===
Hello World

=== bc calculator ===
3.14285714285714285714

=== System info ===
Linux hostname 5.15.0-91-generic #101-Ubuntu SMP x86_64 GNU/Linux

=== Disk usage ===
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1       500G  120G  380G  24% /

विधि 2: stderr भी कैप्चर करना

string execCommandWithError(const string &cmd) {
    // stderr को stdout में रीडायरेक्ट करें
    string fullCmd = cmd + " 2>&1";
    return execCommand(fullCmd);
}

विधि 3: C++23 std::process (भविष्य)

// C++23 प्रस्तावित (अभी तक मानक नहीं)
#include <process>

int main() {
    std::process p("echo", "Hello");
    auto result = p.wait();
    cout << result.stdout();
}

विधि 4: Boost.Process (वर्तमान में सर्वश्रेष्ठ क्रॉस-प्लेटफॉर्म)

#include <boost/process.hpp>
#include <iostream>
#include <string>

namespace bp = boost::process;

int main() {
    bp::ipstream out;
    bp::child c("echo Hello World", bp::std_out > out);
    
    string line;
    while (c.running() && std::getline(out, line)) {
        cout << line << '\n';
    }
    c.wait();
    
    // आर्गुमेंट्स के साथ
    bp::child c2("bc", "-l", bp::std_in < "22/7\n", bp::std_out > out);
    c2.wait();
    
    return 0;
}

सुरक्षा चेतावनी

  • कमांड इंजेक्शन: कभी भी अनट्रस्टेड इनपुट को सीधे कमांड में न डालें
  • शेल इंजेक्शन: popen("cmd " + userInput, ...) खतरनाक है
  • समाधान: आर्गुमेंट्स को अलग-अलग पास करें (Boost.Process, posix_spawn) या इनपुट सैनेटाइज करें
// ❌ असुरक्षित
system("echo " + userInput);

// ✅ सुरक्षित: Boost.Process आर्गुमेंट वेक्टर
bp::child c("echo", userInput, bp::std_out > out);

// ✅ सुरक्षित: एस्केप करें (केवल शेल के लिए)
string escaped = shellEscape(userInput);
system("echo " + escaped);
  1. OpenCV में C++ का उपयोग करके दीर्घवृत्त कैसे बनाएं? OpenCV में C++ का उपयोग करके दीर्घवृत्त कैसे बनाएं?

    दीर्घवृत्त बनाने के लिए, हमें एक केंद्र, प्रमुख अक्ष और लघु अक्ष की आवश्यकता होती है। इसका मतलब है कि हमें दीर्घवृत्त के लिए तीन पैरामीटर चाहिए। हमें एक मैट्रिक्स चाहिए जहां हम दीर्घवृत्त बनाएंगे, और हमें लाइन की मोटाई और लाइन का रंग घोषित करना होगा। जब हम OpenCV का उपयोग करके दीर्घवृत्त बनाना चाहते

  1. OpenCV में C++ का उपयोग करके रेखा कैसे बनाएं? OpenCV में C++ का उपयोग करके रेखा कैसे बनाएं?

    रेखा बनाने के लिए हमें दो बिंदुओं की आवश्यकता होती है - प्रारंभिक बिंदु और अंतिम बिंदु। हमें रेखा खींचने के लिए एक कैनवास की भी आवश्यकता होती है। OpenCV का उपयोग करके, मैट्रिक्स हमारा कैनवास है, हमें रेखा के प्रारंभिक और अंतिम बिंदुओं को परिभाषित करने की आवश्यकता होती है। हमें रेखा को एक रंग निर्दिष

  1. OpenCV में C++ का उपयोग करके इमेज कैसे लोड करें और दिखाएं? OpenCV में C++ का उपयोग करके इमेज कैसे लोड करें और दिखाएं?

    इस विषय में, हम निर्धारित करेंगे कि C++ में OpenCV का उपयोग करके इमेज कैसे लोड करें और दिखाएं। OpenCV में इमेज लोड करने और दिखाने के लिए निम्नलिखित फ़ंक्शन आवश्यक हैं। Mat: Mat कोई फ़ंक्शन नहीं है। यह एक डेटा संरचना है, एक प्रकार का वेरिएबल। C++ में int, char, string वेरिएबल प्रकारों की तरह, Mat Op