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

如何在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槽矩阵的左上角值。 有人能帮忙吗?

  • 问题内容: 我正在寻找解决上述问题的解决方案。 这是我的“无效代码”。charsInCurrentBuffer始终返回-1! 问题答案: 当你从FD中,“用户的定位缓冲区和文件偏移都必须是文件系统的逻辑块大小的倍数”(引自手册页在Linux上)。其他环境对此可能有不同的约束,并且实际上是依赖于文件系统的。 通常情况并非如此(除非您很幸运)。 如果平台具有该功能,则应考虑使用该功能,或者只是分配一个