2009-03-14 4 views
106

Можно создать дубликат:
How can I run an external program from C and parse its output?C: Запустить системную команду и получить выход?

Я хочу, чтобы запустить команду в Linux и получить текст вернулся из того, что она выводит, но я не хотите этот текст напечатан на экране , Есть ли более элегантный способ, чем создание временного файла?

+1

Уже неоднократно обсуждался. – dmckee

+5

Отмечено как дублированный, но не указывайте на него. Я не думаю, что это идеальное решение. В то же время, как вы говорите, вы дублируете вас, указывая на это. Или лучше!! сделать переадресацию на основе количества дублированных репортеров. – erm3nda

ответ

4

Вам требуется какая-то Inter Process Communication. Используйте pipe или общий буфер.

198

Вы хотите функцию "popen". Вот пример запуска команды «ls/etc» и вывод на консоль.

#include <stdio.h> 
#include <stdlib.h> 


int main(int argc, char *argv[]) 
{ 

    FILE *fp; 
    char path[1035]; 

    /* Open the command for reading. */ 
    fp = popen("/bin/ls /etc/", "r"); 
    if (fp == NULL) { 
    printf("Failed to run command\n"); 
    exit(1); 
    } 

    /* Read the output a line at a time - output it. */ 
    while (fgets(path, sizeof(path)-1, fp) != NULL) { 
    printf("%s", path); 
    } 

    /* close */ 
    pclose(fp); 

    return 0; 
} 
+1

Перенаправление stderr в stdout может быть хорошей идеей, поэтому вы поймаете ошибки. – 2009-03-14 17:12:59

+0

как бы перенаправить stderr в stdout? –

+8

вы должны использовать 'fgets (путь, sizeof (путь), fp)' not 'sizeof (path) -1'. прочитайте руководство – user102008

-6

Обычно, если команда является внешней программой, вы можете использовать ОС, чтобы помочь вам здесь.

command > file_output.txt 

Так что ваш код C будет делать что-то вроде

exec("command > file_output.txt"); 

Затем вы можете использовать файл file_output.txt.

+1

Плакат явно запретил использование временных файлов, но его допустимый подход для некоторых случаев. Просто убедитесь, что вы не используете статическое имя файла, используя безопасное случайное имя файла, или открываете себя для нападений с символикой, которые являются проблемами безопасности. –

+5

этот ответ совершенно неверен, поскольку аргумент, переданный exec, не является командой оболочки. – Alnitak

+0

@ Алнитак, но это * есть пример ... кто волнует, если аргумент не является фактической командой - разве это не означает * не * команду? –

Смежные вопросы