Как правильно реализовать канал для связи с исполняемым файлом на Windows C ++? - PullRequest
0 голосов
/ 18 октября 2019

У меня есть две программы. Следующий код - пример, который я придумал, чтобы понять основы, прежде чем внедрить метод в мою основную программу. Дочерний процесс не редактируется и является исполняемым (так как у меня нет доступа к исходному коду моей основной программы). Код для кода дочернего процесса для моего примера:

#include <iostream>
#include <string>

using namespace std;

bool is_number(const std::string& s)
{
    string::const_iterator it = s.begin();
    while (it != s.end() && std::isdigit(*it)) ++it;
    return !s.empty() && it == s.end();
}

int main() {
    cout << "Enter some positive numbers" << endl;
    string testInput = "";

    while(true) {
        cin >> testInput;
        if(is_number(testInput)) {
            testInput += " is a positive number";
            cout << testInput << endl;
        }
        else {
            cout << "invalid" << endl;
        }
    }

    return EXIT_SUCCESS;                              //never exits
}

Код для родительской функции:

#include <cstdio>
#include <iostream>
#include <memory>
#include <stdexcept>
#include <string>
#include <cstring>
#include <array>

std::string exec(const char* cmd) {
    std::array<char, 128> buffer;
    std::string result;
    std::unique_ptr<FILE, decltype(&_pclose)> pipe(_popen(cmd, "r"), _pclose);
    if (!pipe) {
        throw std::runtime_error("popen() failed!");
    }
    for (int returnNum = 0; returnNum < 5; returnNum++) {
        if(fgets(buffer.data(), buffer.size(), pipe.get()) == nullptr)
            break;
        result += buffer.data();
    }
    return result;
}

int main() {
    std::cout << "Result: " << exec(".\\child.exe") << "." << std::endl;

    system("PAUSE");
    return EXIT_SUCCESS;
}

Код родительской функции был адаптирован из ответа, данного для Как выполнить команду и получить вывод команды в C ++ с помощью POSIX? . Насколько я понимаю, родительская функция открывает исполняемый файл и позволяет мне отправлять команды через командную строку родительских функций (не совсем понятно, как они передаются дочернему процессу, но он работает). Если бы дочерняя функция не была в бесконечном цикле while, результат был бы напечатан на родительский терминал.

Обратите внимание, что мне всегда нужно будет вызывать дочернюю функцию известное количество раз (отсюда цикл for),Мне также не нужен этот код, чтобы он был идеальным, так как я использую программу.

Почему результат никогда не возвращается даже после 5 команд? Как получить результат для возврата? Как отправить команды в коде моей родительской программы вместо того, чтобы вводить их в терминал родительской функции?

...