我用给定的cmd
命令打开一个管道流:
FILE* fp = popen(cmd.c_str(), "r");
如何在不消费的情况下统计其线条?
我试过了:
char* line = NULL;
size_t len = 0;
unsigned int lines = 0;
while(getline(&line, &len, fp) != -1){
++lines;
}
但它消耗fp
管道流。
答案 0 :(得分:3)
我猜你是在Linux或其他POSIX系统上。
你基本上无法处理来自pipe(7)的数据(由popen(3)内部使用...)而不用消费它,因为管道是不可搜索的({{3如果ESPIPE
失败,lseek(2)将失败EACCESS
)
您可以将命令重定向到某个临时文件(使用较低级别fork
,dup2
,execve
mmap(2),如syscalls(2)中所述)然后处理文件并将其倒回(和/或在别处重新发送)或将管道中的所有数据读入内存(因此可用内存是限制因素)。