c++ - 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
其写入文件并连续阅读
解决方案
尝试这样的事情:
#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() 流是块缓冲的。
所以你会得到一些延迟和大块的结果,而不是逐行。
推荐阅读
- python - 将 ctypes args 从 c++ 翻译成 python
- android - RecyclerView:没有附加适配器;跳过布局 Surface 无效
- javascript - 如何从将自动发送的邮件中的工作表中获取信息
- ios - 升级到 Xcode 12 后的词法或预处理器问题
- windows - ZeroMemory 是相当于 null 终止缓冲区的窗口吗?
- php - 使用 php 获取 sql 数据并使用不同的名称显示在 html 表中?
- android - 如何自定义 IconButton 的颜色
- c++ - 使用命名空间标准;或 std:: (Something) 哪一个是好的做法,为什么?
- python - knn 算法 - 类型错误:manhattan_dist() 缺少 1 个必需的位置参数
- python-3.x - 坐标系变换