C ++ obtiene el resultado de salida del comando del sistema linux

Encontré un problema de este tipo durante el desarrollo integrado en el brazo. La función implementada es correcta, pero durante la operación, el mismo operador aparecerá aleatoriamente errores de cálculo al calcular; para restaurar rápidamente el entorno de error , Debe comparar el resultado calculado con el resultado correcto; debido a que la cantidad de datos es relativamente grande, se guarda en un archivo y se compara con md5sum. Pero cuando se ejecutan programas en C ++, es necesario obtener los resultados de las instrucciones del sistema Linux, así que escribí este blog.
Necesita usar popen, pclose, fget tres interfaces de función en C, como se muestra a continuación:

   1. FILE * popen(const char * command, const char * type)

           头文件:#include <stdio.h>

           函数说明:popen()会调用fork()产生子进程,然后从子进程中调用/bin/bash/sh -c 来执行参数command的指令。

           参数说明:

                   command:指令;

                   type:r调用进程读取command的标准输出;w调用进程写到command的标准输入;

           返回值说明:

                   如果成功返回文件指针,如果失败返回NULL,错误原因存于errno中。

   2. int pclose ( FILE * stream )

           头文件:#include <stdio.h>

           函数说明:用来关闭由popen所建立的管道及文件指针。

           参数说明:

                   stream:为popen()所返回的文件指针。

           返回值说明:

                   如果成功返回shell的终止状态,若出错返回-1,错误原因,原因存于errno中。

  3. char *fgets(char *str, int n, FILE *stream) 

           头文件:#include <stdio.h>

           函数说明:从指定的流stream读取一行,并把它存储在str所指向的字符串内。当读取(n-1)个字符时,或读取到换行符时,或者到达文件末尾,会停止。

           参数说明:

                   str:指向一个字符数组的指针,该数组存储了要读取的字符串;

                   n:读取的最大字符数。通常为str的数组长度

                   stream:指向FILE对象的指针,该FILE对象标识了要从中读取字符的流

           返回值说明:

                   如果成功返回相同的str参数,如果到达文件末尾或者没有读取到任何字符,str的内容不良,并返回一个空指针,如果发生错误,返回一个空指针。

Las principales funciones utilizadas se han explicado brevemente y el código fuente se encuentra directamente debajo

/**
 *@用与获取cmd指令运算的结果,并将cmd执行后的输出结果保存到code中
 *@param[0] cmd 需要运行的指令
 *@param[1] code 将指令的输出结果保存在该字符串中
 **/
void aiden_system(const char *cmd, std::string& code)
{
    
    
    char result[10240] = {
    
    0};
    char buf[1024] = {
    
    0};
    FILE *fp = NULL;

    if( (fp = popen(cmd, "r")) == NULL ) {
    
    
        printf("popen error!\n");
        return;
    }

    while (fgets(buf, sizeof(buf), fp)) {
    
    
        strcat(result, buf);
    }

    pclose(fp);
    printf("result: %s\n", result);
    std::string code_ = std::string(result);
    code = std::string(result);
}

Supongo que te gusta

Origin blog.csdn.net/CFH1021/article/details/104838342
Recomendado
Clasificación