Когда процесс, стартовавший с помощью popen
pclose. Вызов pclose вернет управление, только когда процесс, запущенный с помощью popen, завершится. Если он все еще выполняется во время вызова pclose, вызов pclose будет ждать окончания процесса.Функция pclose
wait перед вызовом pclose, статус завершения будет потерян, поскольку вызванный процесс закончен, и функция pclose вернет -1 с переменной errno, получившей значение ECHILD.Выполните упражнение 13.1.
Давайте опробуем простой пример popen1.c с функциями popen
pclose. Вы будете применять в программе popen для доступа к информации из uname. uname — это команда, выводящая системную информацию, включая тип компьютера, имя ОС, версию и выпуск, а также сетевое имя машины.Запустив программу, вы откроете канал к uname
read_fp, как указатель на вывод. В конце канал, на который указывает read_fp, закрывается.#include
#include
#include
#include
int main() {
FILE *read_fp;
char buffer[BUFSIZ +1];
int chars_read;
memset(buffer, '\0', sizeof(buffer));
read_fp = popen("uname -a", "r");
if (read_fp ! = NULL) {
chars_read = fread(buffer, sizeof(char), BUFSIZ, read_fp);
if (chars_read > 0) {
printf("Output was:-\n%s\n", buffer);
}
pclose(read_fp);
exit(EXIT_SUCCESS);
}
exit(EXIT_FAILURE);
}
Когда вы выполните программу, то должны получить вывод, похожий на следующий (полученный на одной из машин авторов):
$ ./popen1
Output was:-
Linux suse103 2.6.20.2-2-default #1 SMP Fri Mar 9 21:54:10 UTC 2001 i686 i686 i386 GNU/Linux
Как это работает
Программа применяет функцию popen
uname с параметром -а. Затем она использует возвращенный файловый поток для чтения данных, до BUFSIZ символов (как задано в директиве #define из файла stdio.h), и затем выводит их на экран. Поскольку вы перехватываете вывод команды uname внутри программы, его можно обрабатывать.Отправка вывода в
Теперь, когда вы рассмотрели пример захвата вывода из внешней программы, давайте познакомимся с отправкой вывода во внешнюю программу. В упражнении 13.2 показана программа popen2.c, передающая по каналу данные другой программе. В этом примере будет использована команда od (от англ.
Взглянув на следующий программный код, вы увидите, что он очень похож на предыдущий пример, за исключением того, что вы пишете данные в канал вместо чтения данных из него. Далее приведена программа popen2.c.
#include
#include
#include
#include
int main() {
FILE *write_fp;
char buffer[BUFSIZ + 1];
sprintf(buffer, "Once upon a time, there was...\n");
write_fp = popen("od -c", "w");
if (write_fp != NULL) {
fwrite(buffer, sizeof(char), strlen(buffer), write_fp);
pclose(write_fp);
exit(EXIT_SUCCESS);
}
exit(EXIT_FAILURE);
}
После выполнения этой программы вы должны получить следующий вывод:
$ ./popen2
0000000 O n c e u p o n a t i m e
0000020 , t h e r e w a s . . . \n
0000037
Как это работает
Программа применяет popen
od -с таким образом, что может отправить данные этой команде. Затем она отправляет строку, которую команда od -с получает и обрабатывает; далее команда od -с выводит результат обработки в своем стандартном выводе.Такой же вывод можно получить из командной строки с помощью следующей команды:
$ echo "Once upon a time, there was..." | od -c
Передача данных большого объема