C ++ Прочитать непрерывный поток команд - PullRequest
0 голосов
/ 02 июня 2019

Я хотел бы прочитать непрерывный выходной поток команд, таких как tcpdump, из программы на С ++.

#include <iostream>
#include <string>
#include <stdio.h>


std::string outputcmd(std::string cmd){
    std::string data;
    char singlelinedata[1024];
    FILE * streamdata;
    streamdata = popen(cmd.c_str(), "r");
    cmd.append(" 2>&1");
    std::cout << feof(streamdata);
    if(streamdata){
        while(!feof(streamdata)){
            // if(fgets(singlelinedata, 1024, streamdata)  != NULL ){
            //     data.append(singlelinedata);
            // }
            if(fread(singlelinedata, 1024, sizeof(singlelinedata)/sizeof(singlelinedata),streamdata)){
                data.append(singlelinedata);
            }
        }
        pclose(streamdata);
    }
    return data;
}

int main(){

    std::string outp;
    outp = outputcmd("sudo tcpdump -i any -v");
    std::cout << outp;
    return 0;
}

Это дает мне только вывод первой строки tcpdump -i any -v

enter image description here

Я не хочу Write to file and read again, как следует. Сделайте tcpdump -i any -v -w myfile, чтобы записать это в файл и постоянно читать

1 Ответ

1 голос
/ 02 июня 2019

Попробуйте что-то вроде этого:

#include <iostream>
#include <string>
#include <stdio.h>


void outputcmd(std::string cmd){
    char buffer[1024];
    FILE * pipef = popen(cmd.c_str(), "r");
    if(pipef){
        while(!feof(pipef)){
            int res;
            if((res = fread(buffer, /*note order here*/ 1, sizeof(buffer), pipef)) > 0){
                std::string block(buffer, res);
                std::cout << "read from pipe: [" << block << "] size " << block.size() << std::endl;
            }
        }
        pclose(pipef);
    }
}

int main(){
    outputcmd("sudo tcpdump -i any -v");
    return 0;
}

Одна заметка из справочной страницы

Обратите внимание, что выходные потоки popen () по умолчанию имеют блочную буферизацию.

так что вы получите результаты с некоторой задержкой и большими кусками, а не построчно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...