Я использую следующий код, чтобы попытаться прочитать результаты команды df
в Linux, используя popen
.
#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 Forums и C ++ Reference , так что я не женат на нем. Если кто-то может предложить лучший способ прочитать результаты вызова системы (), я открыт для новых идей.
РЕДАКТИРОВАТЬ в оригинал: Хорошо, bufSize
подходит к отрицательному значению, и теперь я понимаю, почему. Вы не можете получить произвольный доступ к каналу, как я наивно пытался сделать.
Я не могу быть первым, кто попытается это сделать. Может ли кто-нибудь привести (или указать мне) пример того, как прочитать результаты вызова system () в переменную в C ++?