Как выполнить команду оболочки в C? - PullRequest
3 голосов
/ 12 мая 2011

У меня проблемы с выполнением команд оболочки на C. Я хочу выполнить команду оболочки на C, затем перехватить вывод команды оболочки и обработать ее дальше. Я использовал следующий код для выполнения функций. Но проблема в том, что когда команда оболочки не возвращает никакого вывода, fgets () возвращает ненужную информацию?

Чтобы пояснить на примере, если / etc / version содержит разделенные значения ',', shell возвращает выходные данные, а fgets возвращает значение, возвращаемое командой shell, но когда / etc / version не содержит никаких разделенных символов ',' значения, shell не возвращает никакого значения, а fgets возвращает ненужную информацию. Есть ли обходной путь для этой проблемы или есть альтернативное решение для выполнения команды оболочки в C и захвата вывода команды оболочки?

char return_val[256];
FILE *fp = NULL;
char line[256];
memset (return_val, 0, 256);
/* set the defalut value */
strncpy (return_val, "N/A", 4);
char cmd[] = "if [ -f /etc/umts2100_version ]; then cut -d, -f1 -s /etc/umts2100_version ; fi";

/* Open the command for reading. */
fp = popen(cmd, "r");
if (fp != NULL) 
{
    /* read the line from file */
    fgets (line, 256, fp);
    if( line != NULL)
    {
            /* copy the data */
            strncpy(return_val, line, strnlen (line, 256)); 
        }
      /* close the file */ 
    pclose (fp);
}

1 Ответ

2 голосов
/ 12 мая 2011

Вам необходимо проверить возвращаемое значение fgets. Тестируемый вами указатель никогда не будет иметь значение NULL, поскольку Fgets не изменяет свои параметры.

if ( fgets (line, 256, fp) == NULL ) {
    // read failed
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...