понедельник, 12 декабря 2016 г.

C++ command line helper

Иногда надо исполнить какую-то команду ОС. Это легко делается с помощью создания нового процесса и получение данных от него через пайп:

#include <iostream>
#include <stdio.h>
#include <memory>
 
bool run_shell_cmd(const std::string & cmd, std::string & outputStr)
{
    int closePipeResult = -1;
    // deleter to close pipe
    auto pipeDeleter = [&closePipeResult](FILE* pipe)
    {
        if(pipe != NULL)
            closePipeResult = pclose(pipe);
    };
    // create smart poinetr with custom deleter
    std::unique_ptr<FILE, decltype(pipeDeleter)> pipe(popen(cmd.c_str(), "r"), pipeDeleter);
 
    if(pipe.get() == NULL) 
        return false;
 
    // read output and save it to string
    char buffer[128];
    while (!feof(pipe.get()))
    {
        if (fgets(buffer, 128, pipe.get()) != NULL)
            outputStr += buffer;
    }
 
    // reset pointer to get result of pclose before exit of function
    pipe.reset();
 
    return (closePipeResult == 0);
}

Комментариев нет:

Отправить комментарий