Книга: Основы программирования в 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 внутри программы, его можно обрабатывать.

Оглавление книги

Оглавление статьи/книги

Генерация: 0.860. Запросов К БД/Cache: 2 / 0
поделиться
Вверх Вниз