Запустить программу из своей программы и прочитать ее вывод в командную строку - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Вопрос должен быть простым, но нигде не могу найти ответ. Функция system этого не позволяет. Есть ли такая возможность, как, например, в функции exec в PHP. Операционная сиcтема Linux.

Решение задачи: «Запустить программу из своей программы и прочитать ее вывод в командную строку»

textual
Листинг программы
/* стандарт ANSI C 99 с целью объявления переменных, где удобнее,
к сути программы отношения не имеет. 
Читает построчно вывод утилиты cat с переданным ей своим первым параметром */
#define _XOPEN_SOURCE
 
#include <stdio.h>
#include <string.h>
#include <assert.h>
 
#define PROGRAM_NAME argv[0]
#define FILE_NAME argv[1]
 
int main(int argc, char ** argv) {
    if ( argc < 2 ) {
        printf("USAGE: %s file_name\n", PROGRAM_NAME);
        return -1;
    }
    
    char cmd[BUFSIZ] = "/bin/cat ";
    strcat(cmd, FILE_NAME);
    
    FILE * pip = popen(cmd, "r");
    assert(pip);
    
    char buf[BUFSIZ];
    while ( fgets(buf, BUFSIZ, pip) )
        printf("%s", buf);
    
    pclose(pip);
    
    return 0;
}

Объяснение кода листинга программы

  1. Стандарт ANSI C 99 используется для объявления переменных там, где это удобно. Это не имеет отношения к сути программы.
  2. Программа использует функции из библиотеки stdio.h для ввода и вывода данных.
  3. Переменная PROGRAM_NAME содержит имя программы, переданное в командной строке.
  4. Переменная FILE_NAME содержит имя файла, переданное в командной строке.
  5. Если количество аргументов в командной строке меньше 2, программа выводит сообщение об использовании и завершает работу.
  6. Создается строка cmd, которая содержит команду для выполнения (cat имя_файла).
  7. Используется функция popen для запуска команды и получения ее вывода.
  8. Выполняется проверка, что файловый дескриптор, полученный от функции popen, не равен NULL.
  9. Создается буфер buf для хранения вывода команды.
  10. В цикле while с помощью функции fgets считываются строки из файла, связанного с файловым дескриптором pip, и выводятся на экран.
  11. Используется функция pclose для закрытия файлового дескриптора, полученного от функции popen.
  12. Программа возвращает 0, если все выполнено успешно.

Оцени полезность:

8   голосов , оценка 3.875 из 5
Похожие ответы