Книга: Основы программирования в Linux
pclose
pclose
Когда процесс, стартовавший с помощью popen
, закончится, вы можете закрыть файловый поток, связанный с ним, с помощью функции pclose
. Вызов pclose
вернет управление, только когда процесс, запущенный с помощью popen
, завершится. Если он все еще выполняется во время вызова pclose
, вызов pclose
будет ждать окончания процесса.
Функция pclose
обычно возвращает код завершения процесса, чей файловый поток она закрывает. Если вызывающий процесс уже выполнил оператор wait
перед вызовом pclose
, статус завершения будет потерян, поскольку вызванный процесс закончен, и функция pclose
вернет -1 с переменной errno
, получившей значение ECHILD
.
Выполните упражнение 13.1.
Упражнение 13.1. Чтение вывода внешней программы
Давайте опробуем простой пример popen1.c с функциями popen
и pclose
. Вы будете применять в программе popen
для доступа к информации из uname
. uname
— это команда, выводящая системную информацию, включая тип компьютера, имя ОС, версию и выпуск, а также сетевое имя машины.
Запустив программу, вы откроете канал к uname
; сделаете его читаемым и зададите read_fp
, как указатель на вывод. В конце канал, на который указывает read_fp
, закрывается.
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main() {
FILE *read_fp;
char buffer[BUFSIZ +1];
int chars_read;
memset(buffer, '', 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%sn", 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 внутри программы, его можно обрабатывать.