首页 > 解决方案 > C++ 读取连续命令输出流,如 tcpdump

问题描述

我想tcpdump从 C++ 程序中读取命令的连续输出流。

#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

在此处输入图像描述

我不想Write to file and read again喜欢跟随。将tcpdump -i any -v -w myfile其写入文件并连续阅读

标签: c++popenoutputstream

解决方案


尝试这样的事情:

#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() 流是块缓冲的。

所以你会得到一些延迟和大块的结果,而不是逐行。


推荐阅读