当前位置: 首页 > 面试题库 >

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

司徒炎彬
2023-03-14
问题内容

我正在使用以下代码来尝试使用读取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()调用结果的示例吗?


问题答案:

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

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

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

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

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



 类似资料:
  • jna 中 structure 结构体怎么读取, 在回调函数中 我收到对方返回一个 pointer 是海康的sdk NET_DVR_SetDVRMessageCallBack_v50 的回调函数 有个 pAlarmInfo:Pointer 类型, 想接收为 NET_DVR_ACS_ALARM_INFO 类型, 要怎么做 我试过这样读取, 但没有讲到到

  • 我对webapi相当陌生,已经开发了一个小型webapi,它有一些操作并返回我的自定义类Response。 现在我遇到的困难是,我不知道如何读取从webapi操作返回的响应数据,并从我的响应类中提取json。在获得json之后,如何将该json 发送到customer类。 这就是我调用webapi函数的方式: null 1)如何在客户端获取webapi返回的响应类 2)如何从响应类中提取json

  • 问题内容: 我想使用串行com端口进行通信,并且每次调用read函数调用时都想实现超时。 编辑: 我正在使用Linux OS。如何使用选择函数调用实现? 问题答案: select()有5个参数,首先是最高的文件描述符+ 1,然后是fd_set用于读取,一个用于写入,一个用于异常。最后一个参数是struct timeval,用于超时。错误时返回-1,超时时返回0或设置的集合中文件描述符的数量。

  • 问题内容: 我使用vfat驱动程序将FAT文件系统安装在Linux中。我想知道如何读取文件的vfat属性,例如“隐藏”和“只读”。 根据到目前为止的读物,如果我在文件上使用glibc命令,则只会得到此处列出的文件属性:http : //www.gnu.org/s/libc/manual/html_node/Attribute -Meanings.html#Attribute- Meanings 但

  • 所以我很容易地阅读了我的shapefile: 那么如果我做头部(形状,1),我会得到以下结果: 所以获取数据很简单,我只需创建$NAME,然后从数据中获取所有名称。 但是我不知道如何访问它说插槽“协弦”的地方,这就是我想要访问的…或者就此而言,我如何访问不在数据槽上的东西? 换句话说,我想读取shapefile并以一个等于1824583的变量结束,这是coords槽矩阵的左上角值。 有人能帮忙吗?

  • 问题内容: 如何在程序中不使用环境(getenv,…)的情况下获取实际的“用户名”? 问题答案: 中 定义的函数返回用户名。请参阅以获取更多信息。 它的签名是: 不用说,可以在C或C ++中轻松调用此函数。