10.5.2. Чтение и запись из процесса

10.5.2. Чтение и запись из процесса

Хотя system() отображает результат работы команды на устройство стандартного вывода и позволяет дочерним программам читать стандартный ввод, это не всегда идеально. Часто процесс желает читать вывод другого процесса либо отправлять текст на стандартный ввод. popen() облегчает процессам решение этой задачи[29].

FILE * popen(const char *cmd, const char *mode);

cmd выполняется через оболочку, как и в system(). Параметр mode должен быть "r", если родительский процесс желает читать командный вывод, и "w" — для записи в стандартный ввод дочернего процесса. Следует отметить, что с помощью popen() делать одновременно чтение и запись нельзя.

Два процесса, которые читают и пишут друг в друга, достаточно сложны[30] и выходят за рамки возможностей popen()[31].

popen() возвращает FILE* (как это определено в стандартной библиотеке ввода-вывода ANSI/ISO), который может быть прочитан и записан подобно любому другому потоку stdio[32], либо NULL, если операция не удается. Когда завершается родительский процесс, он может воспользоваться pclose() для закрытия потока и прерывания дочернего процесса, если он все еще выполняется. Подобно system(), pclose() возвращает состояние дочернего процесса из wait4().

int pclose(FILE *stream);

Ниже приведен пример простой программы-калькулятора, которая использует программу bc для выполнения всей реальной работы. Важно сбрасывать поток, полученный от popen(), после записи в него, чтобы предотвратить буферизацию stdio от задержки вывода (подробности о буферизации стандартных функций библиотеки stdio можно найти в [15]).

 1: /*calc.c*/

 2:

 3: /* Это очень простой калькулятор, который использует внешнюю команду bc

 4:    для выполнения всей работы. Открывает канал к bc, читает команду,

 5:    передает ее bc и завершается. */

 6: #include <stdio.h>

 7: #include <sys/wait.h>

 8: #include <unistd.h>

 9:

10: int main(void) {

11:  char buf[1024];

12:  FILE *bc;

13:  int result;

14:

15:  /* открыть канал на bc и выйти в случае неудачи */

16:  bc = popen("bc", "w");

17:  if (!bc) {

18:   perror("popen");

19:   return 1;

20:  }

21:

22:  /* пригласить ввести выражение, и прочитать его */

23:  printf("expr:"); fflush(stdout);

24:  fgets(buf, sizeof(buf), stdin);

25:

26:  /* послать выражение bc для вычисления */

27:  fprintf(bc, "%s ", buf);

28:  fflush(bc);

29:

30:  /* закрыть канал на bc и ожидать выхода из нее */

31:  result = pclose(bc);

32:

33:  if (!WIFEXITED(result))

34:   printf("(аварийный выход) ");

35:

36:  return 0;

37: }

Подобно system(), popen() запускает команды через системную оболочку и должна использоваться с большой осторожностью, если вызывается из программы со специальными полномочиями.

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

Чтение и запись файлов

Из книги Microsoft Visual C++ и MFC. Программирование для Windows 95 и Windows NT автора Фролов Александр Вячеславович

Чтение и запись файлов Для доступа к файлам предназначены пять различных методов класса CFile: Read, ReadHuge, Write, WriteHuge, Flush. Методы Read и ReadHuge предназначены для чтения данных из предварительно открытого файла. В 16-разрядной операционной системе Windows функция Read может считать не


Чтение и запись

Из книги Справочник по PHP автора

Чтение и запись freadЧитает из открытого файла определенное количество символов.Синтаксис:string fread(int $f, int $numbytes)Читает из файла $f $numbytes символов и возвращает строку этих символов. После чтения указатель файла продвигается к следующему после прочитанного блока позициям. Если


11.2.4. Чтение, запись и перемещение

Из книги Разработка приложений в среде Linux. Второе издание автора Джонсон Майкл К.

11.2.4. Чтение, запись и перемещение Хотя есть несколько способов читать и писать файлы, мы обсудим здесь только простейшие из них[42]. Чтение и запись почти идентичны, поэтому рассмотрим их одновременно.#include <unistd.h>size_t read(int fd, void * buf, size_t length);size_t read(int fd, const void * buf, size_t length);Обе


11.2.5. Частичное чтение и запись

Из книги VBA для чайников автора Каммингс Стив

11.2.5. Частичное чтение и запись Хотя обе функции — и read(), и write() — принимают параметр, указывающий, сколько байт нужно прочитать или записать, ни одна из них не гарантирует, что обработает указанное количество байт, даже если не случается никаких ошибок. Простейший пример


Чтение и запись данных

Из книги C++. Сборник рецептов автора Диггинс Кристофер

Чтение и запись данных Есть несколько VBA-команд для записи и извлечения данных из файла. В приведенной ниже таблице описана их работа. Пример команды Использование Пояснение Оператор Put Предназначен для записи переменных в файл Put #1, 1800, StrQuote (записывает переменную


13.2. Запись и чтение чисел

Из книги Linux программирование в примерах автора Роббинс Арнольд

13.2. Запись и чтение чисел ПроблемаТребуется записать число в поток в форматированном виде в соответствии с местными соглашениями.РешениеЗакрепите (imbue) текущую локализацию за потоком, в который вы собираетесь писать данные, и запишите в него числа, как это сделано в


13.3. Запись и чтение дат и времен

Из книги Программирование для Linux. Профессиональный подход автора Митчелл Марк

13.3. Запись и чтение дат и времен ПроблемаТребуется отобразить или прочитать значения дат и времен, используя местные соглашения по форматированию.РешениеИспользуйте тип time_t и tm struct из <ctime>, а также фасеты даты и времени, предусмотренные в <locale>, для записи и чтения


Чтение и запись данных

Из книги UNIX: разработка сетевых приложений автора Стивенс Уильям Ричард

Чтение и запись данных Функции ввода/вывода верхнего уровня позволяют передавать данные различными способами.Операции чтения и записи в потоках начинаются с текущей. позиции в потоке, идентифицируемой как "file pointer"(указатель файла) для потока. Указатель файла изменяется


Чтение и запись данных

Из книги QT 4: программирование GUI на С++ автора Бланшет Жасмин

Чтение и запись данных Функции read и write, как и функции ввода/вывода верхнего уровня, начинают выполнение очередной операции с текущей позиции в файле. Текущая позиция изменяется при каждой операции чтения или записи.Функция eof может быть использована для проверки на конец


Б.1. Чтение и запись данных

Из книги автора

Б.1. Чтение и запись данных Первая функция ввода-вывода, с которой сталкиваются те, кто начинают изучать язык С, называется printf(). Она форматирует текстовую строку и записывает ее в стандартный выходной поток. Обобщенная ее версия fprintf() записывает текст в заданный поток.


18.3. Чтение и запись

Из книги автора

18.3. Чтение и запись Создав маршрутизирующий сокет, процесс может отправлять ядру команды путем записи в этот сокет и считывать из него информацию от ядра. Существует 12 различных команд маршрутизации, 5 из которых могут быть запущены процессом. Они определяются в


19.2. Чтение и запись

Из книги автора

19.2. Чтение и запись Все сообщения в сокете управления ключами должны иметь одинаковые заголовки, соответствующие листингу 19.1[1]. Сообщение может сопровождаться различными расширениями в зависимости от наличия дополнительной информации или необходимости ее