我正在使用以下代码尝试使用df
命令的结果。
#include <iostream> // file and std I/O functions
int main(int argc, char** argv) {
FILE* fp;
char * buffer;
long bufSize;
size_t ret_code;
fp = popen("df", "r");
if(fp == NULL) { // head off errors reading the results
std::cerr << "Could not execute command: df" << std::endl;
exit(1);
}
// get the size of the results
fseek(fp, 0, SEEK_END);
bufSize = ftell(fp);
rewind(fp);
// allocate the memory to contain the results
buffer = (char*)malloc( sizeof(char) * bufSize );
if(buffer == NULL) {
std::cerr << "Memory error." << std::endl;
exit(2);
}
// read the results into the buffer
ret_code = fread(buffer, 1, sizeof(buffer), fp);
if(ret_code != bufSize) {
std::cerr << "Error reading output." << std::endl;
exit(3);
}
// print the results
std::cout << buffer << std::endl;
// clean up
pclose(fp);
free(buffer);
return (EXIT_SUCCESS);
}
这个代码出现了“内存错误”,退出状态为2,所以我可以看到它在哪里失败,但我不明白为什么。
我是从在Ubuntu论坛和C++参考找到的示例代码中整合出来的,因此我不会偏执于它。如果有人能建议更好的方式来读取system()调用的结果,我会很乐意接受新想法。
对原文进行编辑:好的,bufSize
变成了负数,现在我明白为什么了。像我曾经天真地尝试的那样,你不能随意访问一个管道。
我肯定不是第一个尝试做这件事的人。有人能否给我一个(或指向我一个)在C++中将系统()调用的结果读取到变量中的示例?