一尘不染

如何在C ++中读取system()调用的结果?

linux

我正在使用以下代码来尝试使用读取dfLinux中命令的结果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论坛C
++参考
上找到的示例代码放在一起,所以我不喜欢它。如果有人可以建议一种更好的方式来读取system()调用的结果,那么我可以接受新的想法。

编辑原文: 好的,bufSize现在是负面的,现在我明白为什么了。您不能像我天真的尝试那样随机访问管道。

我不能成为第一个尝试这样做的人。有人可以给(或指向我)如何在C ++中读取system()调用结果的示例吗?


阅读 809

收藏
2020-06-07

共1个答案

一尘不染

为什么会std::malloc()失败?

明显的原因是“因为std::ftell()返回了负号,然后将其视为巨大的未签名号”。

根据文档std::ftell()如果失败,则返回-1。失败的一个明显原因是
您无法在管道或FIFO中进行查找

跑不了的; 您无法不读取而无法知道命令输出的长度,并且只能读取一次。您必须分块读取它,或者根据需要增加缓冲区或动态解析。

但是,当然,您可以直接使用系统调用df来获取其信息来直接避免整个问题:statvfs()

2020-06-07