&1”); std::cout,c++,popen,outputstream,C++,Popen,Outputstream" /> &1”); std::cout,c++,popen,outputstream,C++,Popen,Outputstream" />

C++;读取连续命令输出流,如tcpdump < >我想从C++程序中读取像“代码> 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; } #包括 #包括 #包括 std::string outputcmd(std::string cmd){ std::字符串数据; 字符单线数据[1024]; 文件*数据流; streamdata=popen(cmd.c_str(),“r”); cmd.append(“2>&1”); std::cout

C++;读取连续命令输出流,如tcpdump < >我想从C++程序中读取像“代码> 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; } #包括 #包括 #包括 std::string outputcmd(std::string cmd){ std::字符串数据; 字符单线数据[1024]; 文件*数据流; streamdata=popen(cmd.c_str(),“r”); cmd.append(“2>&1”); std::cout,c++,popen,outputstream,C++,Popen,Outputstream,试试这样的方法: #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;

试试这样的方法:

#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;
}
#包括
#包括
#包括
void outputcmd(std::string cmd){
字符缓冲区[1024];
文件*pipef=popen(cmd.c_str(),“r”);
if(pipef){
而(!feof(pipef)){
国际关系;
如果((res=fread(buffer,/*注意这里的顺序*/1,sizeof(buffer),pipef))>0){
字符串块(缓冲区,res);

std::可能您需要在到达
EOF
后重试,因为流需要时间进行缓冲?这与您的问题无关,但是
sizeof(singlelinedata)/sizeof(singlelinedata)
可以更简单地写成
1
。您已经有了一个数据流:
streamdata
cmd.append(“2>&1”)
popen
不执行任何操作后,该命令已在没有it@jakub_b您知道在执行过程中何时撤销popen()streams块吗?,(是否仅当
tcpdump
发送关闭信号时?)或者我可以强制触发停止缓冲,并在每次X之后读取缓冲seconds@abdulrashid关于块缓冲的说明意味着您将获得4096(?)块中的数据 bytes@abdulrashid如果你想要一个popen的行缓冲模拟,你可能需要使用fork&exec制作你自己的,如这里所示,谢谢@jakub\d它工作了。另外,我从你的回复中发现string有一个构造函数
std::string abc(“我的string”)