как получить результат системы () в C/C++ [дубликат]

6
задан Community 23 May 2017 в 11:47
поделиться

2 ответа

Да, вы можете это сделать, но не можете использовать system () , вам придется использовать popen () вместо этого. Примерно так:

FILE *f = popen("ipdisp", "r");
while (!feof(f)) {
    // ... read lines from f using regular stdio functions
}
pclose(f);
8
ответ дан 10 December 2019 в 02:47
поделиться

Грег не совсем прав. Вы можете использовать систему, но это действительно плохая идея. Вы можете использовать систему, записав вывод команды во временный файл, а затем прочитав файл ... но popen () - гораздо лучший подход. Например:

#include <stdlib.h>
#include <stdio.h>
void
die( char *msg ) {
    perror( msg );
    exit( EXIT_FAILURE );
}

int
main( void )
{
    size_t len;
    FILE *f;
    int c;
    char *buf;
    char *cmd = "echo foo";
    char *path = "/tmp/output"; /* Should really use mkstemp() */

    len = (size_t) snprintf( buf, 0,  "%s > %s", cmd, path ) + 1;
    buf = malloc( len );
    if( buf == NULL ) die( "malloc");
    snprintf( buf, len, "%s > %s", cmd, path );
    if( system( buf )) die( buf );
    f = fopen( path, "r" );
    if( f == NULL ) die( path );
    printf( "output of command: %s\n", buf );
    while(( c = getc( f )) != EOF )
        fputc( c, stdout );
    return EXIT_SUCCESS;
}

При таком подходе возникает множество проблем ... (переносимость синтаксиса для перенаправления, оставление файла в файловой системе, проблемы безопасности с другими процессами, читающими временный файл и т. Д., И т. Д.)

1
ответ дан 10 December 2019 в 02:47
поделиться