Как использовать Poco ProcessHandle с командой sed linux, содержащей звездочку - PullRequest
0 голосов
/ 04 июля 2018

Я хочу создать приложение на c ++ для Ubuntu 16.04, которое получает данные из папки / sys / class / net / eth0 / statistics /. В частности, мне нужно получить rx_bytes и rx_packets. Команда, которую я успешно попробовал в терминале, следующая:

sed -n -e 3p -e 13p /sys/class/net/enp0s3/statistics/*

Я попытался дать ту же команду, используя метод Poco ProcessHandle, используя следующий код:

#include <iostream>
#include <vector>
#include "Poco/Exception.h"
#include "Poco/Process.h"
#include "Poco/Pipe.h"
#include "Poco/PipeStream.h"

using namespace std;
using Poco::Process;
using Poco::ProcessHandle;
using Poco::Pipe;
using Poco::PipeInputStream;
using Poco::PipeOutputStream;
using Poco::Exception;

int main(int argc, char** argv)

{

    try {

        std::vector<std::string> args;

        std::string cmd = "sed";

        args.push_back("-n");
        args.push_back("-e");
        args.push_back("3p");
        args.push_back("-e");
        args.push_back("15p");
        args.push_back("/sys/class/net/enp0s3/statistics/*");

        Pipe outPipe;

        ProcessHandle ph = Process::launch(cmd, args, 0, &outPipe, 0);

        PipeInputStream istr(outPipe);

        std::string s;
        int c = istr.get();
        while (c != -1) {
            s += (char)c;
            c = istr.get();
        }
        std::cout << "string is " << s << std::endl;
        return 0;
    }

    catch (Poco::Exception& exc)

    {

        std::cerr << exc.displayText() << exc.code() << string(exc.name()) << std::endl;

        return 1;
    }

Однако я получаю сообщение об ошибке:

sed: can't read /sys/class/net/enp0s3/statistics/*: No such file or directory

Когда я пробую код с определенным файлом, я получаю правильные строки. Я знаю, что есть альтернатива command cat, но есть ли способ, чтобы приведенный выше код работал успешно.

...