Чтение консоли вывода для пинга в C - PullRequest
1 голос
/ 20 января 2020

Я сейчас пытаюсь написать несколько тестов с пингом разных IP-адресов. Я получил system() для этих команд, но я хотел бы прочитать вывод консоли и на основе этой записи string(like TEST PASSED/TEST FAILED). Есть ли способ сделать это без сохранения журнала консоли в файл и чтения из него (мне кажется, слишком запутанным).

Ниже приведен простой пример кода, который я сделал:

switch (choice) {
    case 1:
        system("ping -c " STR(COUNTER)" -w "STR(TIMER) " " STR(DEI));
        printf("----------------------------------------------------\n\n");
        break;

    case 2:
        system("ping -c " STR(COUNTER)" -w "STR(TIMER) " " STR(AURIX));
        printf("----------------------------------------------------\n\n");
        break;

    case 3:
        system("ping -c " STR(COUNTER)" -w "STR(TIMER) " " STR(MID2EI));
        printf("----------------------------------------------------\n\n");
        break;

    case 4:
        system("ping -c " STR(COUNTER)" -w "STR(TIMER) " " STR(VEI));
        printf("----------------------------------------------------\n\n");
        break;

    case 5:
        printf("Quitting...\n");
        sleep(1000);
        running = false;
        break;

    default:
        printf("Wrong input. Try again.\n");
        printf("----------------------------------------------------\n\n");
        break;
}

1 Ответ

1 голос
/ 20 января 2020

Если вас интересует сырой монитор доступности, проверить значение выхода ping можно с помощью макросов из <sys/wait.h>

#include <sys/wait.h>
int exit_status = system("ping -c 1 8.8.8.8");

if (WIFEXITED(exit_status) && WEXITSTATUS(exit_status) == 0)
    puts("Reachable!");
else
    puts("Unreachable");

Если вы действительно хотите проанализировать выходные данные, popen() пример из https://pubs.opengroup.org/onlinepubs/009696799/functions/popen.html вполне соответствует делу:

#include <stdio.h>
...


FILE *fp;
int status;
char path[PATH_MAX];


fp = popen("ls *", "r");
if (fp == NULL)
    /* Handle error */;


while (fgets(path, PATH_MAX, fp) != NULL)
    printf("%s", path);


status = pclose(fp);
if (status == -1) {
    /* Error reported by pclose() */
    ...
} else {
    /* Use macros described under wait() to inspect `status' in order
       to determine success/failure of command executed by popen() */
    ...
}
...