Запустить программу из своей программы и прочитать ее вывод в командную строку - 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;
}
Объяснение кода листинга программы
- Стандарт ANSI C 99 используется для объявления переменных там, где это удобно. Это не имеет отношения к сути программы.
- Программа использует функции из библиотеки stdio.h для ввода и вывода данных.
- Переменная PROGRAM_NAME содержит имя программы, переданное в командной строке.
- Переменная FILE_NAME содержит имя файла, переданное в командной строке.
- Если количество аргументов в командной строке меньше 2, программа выводит сообщение об использовании и завершает работу.
- Создается строка cmd, которая содержит команду для выполнения (cat имя_файла).
- Используется функция popen для запуска команды и получения ее вывода.
- Выполняется проверка, что файловый дескриптор, полученный от функции popen, не равен NULL.
- Создается буфер buf для хранения вывода команды.
- В цикле while с помощью функции fgets считываются строки из файла, связанного с файловым дескриптором pip, и выводятся на экран.
- Используется функция pclose для закрытия файлового дескриптора, полученного от функции popen.
- Программа возвращает 0, если все выполнено успешно.