26.2. Полудуплексные каналы

26.2. Полудуплексные каналы

Напомню, что канал — это способ связи стандартного вывода одного процесса со стандартным вводом другого. Каналы — старожилы UNIX: они появились еще в самых первых версиях UNIX. Полудуплексные каналы позволяют обмениваться информацией только в одном направлении. Если процесс-предок передает информацию со своего стандартного вывода на стандартный ввод потомка — это пример полудуплексного канала.

Что такое перенаправление ввода/вывода и как его использовать из командной строки, вы уже знаете (п. 3.4.6). Сейчас я покажу, как осуществить перенаправление программным путем, то есть без вмешательства пользователя.

Вызов system() порождает дочерний процесс, позволяя ему читать данные со стандартного ввода (stdin) и писать на стандартный вывод (stdout). Иногда нам нужно передать данные дочернему процессу или, наоборот, получить информацию от порожденного процесса. Другими словами, мы хотим, чтобы дочерний процесс получал данные не со стандартного ввода, а от родительского процесса или/и выводил информацию не на стандартный вывод, а передавал ее процессу-предку. Ввод/вывод между процессами осуществляется с помощью системного вызова popen(). Этот вызов должен быть выполнен ДО вызова fork(), чтобы файловые дескрипторы были унаследованы дочерним процессом.

FILE * popen(const char * команда, const char * режим_доступа);

Первый параметр — это название программы, которую мы хотим запустить в дочернем процессе. Второй параметр определяет режим доступа. Установите значение «r», если вам нужно читать вывод дочернего процесса, если же вам нужно передать информацию на стандартный ввод порожденного процесса, установите значение «w». Режима двустороннего обмена не существует.

Вызов popen() возвращает указатель FILE* или пустой указатель NULL, если вызов не удался. Так же, как и при работе с обыкновенными файлами, после завершения операции ввода/вывода вы должны закрыть канал вызовом pclose(). Во время работы с потоком рекомендую использовать вызов fflush(), чтобы предотвратить задержки из-за буферизации.

Теперь несколько простых примеров. Предположим, что нам нужно вывести на стандартный вывод имена всех текстовых файлов, содержащихся в текущем каталоге. Это можно очень просто сделать с помощью вызова system():

system("ls *.txt");

Это уж совсем тривиальная задача — мы просто выводим данные, но никак не обрабатываем их. Как получить все имена текстовых файлов и обработать их в программе?

// открываем поток

FILE *fp = popen("ls *.txt", "r");

// в цикле читаем имена всех текстовых файлов

while ((fname = fgets(..., fp);) != EOF) {

 // обрабатываем полученное значение переменной fname

}

// закрываем поток

pclose(fp);

Этот фрагмент кода в особых комментариях не нуждается. Сначала мы создаем поток для чтения (доступ «r») информации от порожденного процесса (ls *.txt). Затем в цикле while читаем имена файлов до тех пор, пока не будет достигнут конец файла. После окончания операции ввода/вывода закрываем поток вызовом pclose(fp).

Вот теперь мы готовы к тому, чтобы рассмотреть более серьезный пример. В этом примере мы будем передавать данные дочернему процессу. Задача такова: у нас есть две программы. Первая программа передает второй какую-нибудь информацию, вторая обрабатывает ее и выводит на стандартный вывод результат.

Листинг 26.1. Родительский процесс

#include <stdio.h>

#include <sys/wait.h>

#include <unistd.h>

int main() {

 char buff[1024]={0};

 FILE * cp; // cp - child process - дочерний процесс

 int status;

 // Открываем канал. Дочерний процесс - /usr/bin/child

 cp=popen("/usr/bin/child", "w");

 if (!cp) {

  printf("He могу открыть канал. ");

  exit(1);

 }

 printf("Введите информацию для передачи дочернему процессу ");

 // читаем ввод пользователя

 fgets(buff, sizeof(buff), stdin);

 // передаем данные дочернему процессу

 fprintf(cp, "%s ", buff);

 // "выталкиваем" содержимое буфера в канал

 fflush(cp);

 // закрываем канал и проверяем состояние вызова pclose()

 status=pclose(cp);

 if (!WIFEXITED(status))

  printf("ошибка при закрытии канала ");

 printf("Завершение работы родительского процесса ");

 return 0;

}

Листинг 26.2. Дочерний процесс — исходный код /usr/bin/child

#include <stdio.h>

int main() {

 char buff[1024]={0};

 fgets(buff, sizeof(buff), stdin);

 printf("Прочитал со стандартного ввода: %s ", buff);

 printf("Завершение работы дочернего процесса ");

return 0;

}

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

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

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

5.12 КАНАЛЫ

Из книги Архитектура операционной системы UNIX автора Бах Морис Дж

5.12 КАНАЛЫ Каналы позволяют передавать данные между процессами в порядке поступления («первым пришел — первым вышел»), а также синхронизировать выполнение процессов. Их использование дает процессам возможность взаимодействовать между собой, пусть даже не известно,


Каналы

Из книги Язык программирования С# 2005 и платформа .NET 2.0. [3-е издание] автора Троелсен Эндрю

Каналы После того как агенты проверят и отформатируют поставляемые клиентом аргументы, упаковав их в объект сообщении, соответствующий IMessage-совместимый тип передается от реального агента объекту канала. Каналы – это сущности, отвечающие за транспортировку сообщения


Каналы RGB

Из книги Photoshop. Мультимедийный курс автора Мединов Олег

Каналы RGB Проведем простой эксперимент.1. Создайте новое изображение с белым фоном.2. Выберите инструмент Карандаш. Настройте кисть таким образом, чтобы линия карандаша получилась достаточно жирной, например 50 пикселов.3. Выберите чисто красный цвет. Для этого в диалоговом


Каналы CMYK

Из книги Asterisk™: будущее телефонии Второе издание автора Меггелен Джим Ван

Каналы CMYK Аналогичную картину мы увидим, создав изображение в цветовой модели CMYK. Только каналы CMYK, в отличие от RGB, инверсные, то есть черный и белый цвета в этих каналах поменяны местами. Белый цвет означает полное отсутствие красителя, а черный – максимальное его


Каналы-маски

Из книги Программирование на языке Ruby [Идеология языка, теория и практика применения] автора Фултон Хэл

Каналы-маски Вы можете добавить в изображение новый канал. Однако это будет не цветовой, а так называемый альфа-канал, или канал-маска. Для чего могут использоваться такие каналы? Применений множество. Самое простое – это использование масок для изображения или


Каналы IRC

Из книги Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ автора Борри Хелен

Каналы IRC Сообщество разработчиков Asterisk поддерживает каналы ретрансляции интернет-чатов (Internet Relay Chat, IRC) на сайте irc.freenode.net. Самыми активными каналами являются #asterisk и #asterisk-dev[9]. В целях защиты от спама теперь на обоих каналах требуется


Каналы FXO и FXS

Из книги Photoshop CS4 автора Жвалевский Андрей Валентинович

Каналы FXO и FXS Каналы FXO и FXS отличаются друг от друга лишь тем, что один из них обеспечивает тональный сигнал готовности линии. FXO-порт не генерирует тонального сигнала, он его принимает. Самый простой пример - тональный сигнал, поставляемый телефонной компанией. FXS- порт


10.1.13. Каналы

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


22.5. Каналы IRC

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

22.5. Каналы IRC Можно побиться об заклад, что в любое время суток десятки «рубистов» болтают в IRC-чатах. Такие серверы принадлежат freenode.net; зайдите на этот сайт и поищите ближайший к вам. Поиск в Web поможет вам найти подходящий IRC-клиент для любой платформы.В канале #ruby-lang


Именованные каналы

Из книги Операционная система UNIX автора Робачевский Андрей М.

Именованные каналы Firebird поддерживает протокол Мiсrоsоft WNet Named Pipes для серверов Windows NT/2000, XP и клиентов Windows. Имя канала по умолчанию interbas. Windows 9х и ME не Moryт быть серверами WNet.! ! !ПРИМЕЧАНИЕ. Протокол Windows Named Pipes (именованные каналы) часто называют NetBEUI. Строго говоря, NetBEUI является


Каналы

Из книги Linux и UNIX: программирование в shell. Руководство разработчика. автора Тейнсли Дэвид

Каналы Чтобы нарисовать картину, художники используют палитру, смешивая на ней краски. Благодаря этому они получают любые оттенки цветов. В Photoshop для передачи цвета также применяются методы смешения цветов. При этом используется одна из двух основных палитр:• RGB –


9.3.1. Каналы

Из книги Цифровая фотография. Трюки и эффекты автора Гурский Юрий Анатольевич


5.4. Каналы

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

5.4. Каналы Канал — это коммуникационное устройство, допускающее однонаправленное взаимодействие. Данные, записываемые на "входном" конце канала, читаются на "выходном" его конце. Каналы являются последовательными устройствами: данные всегда читаются в том порядке, в


Каналы

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

Каналы Вспомните синтаксис организации программных каналов при работе в командной строке shell:cat myfile | wcПри этом (стандартный) вывод программы cat(1), которая выводит содержимое файла myfile, передается на (стандартный) ввод программы wc(1), которая, в свою очередь подсчитывает


10.6. Дополнительные каналы

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

10.6. Дополнительные каналы Если вы посмотрите на палитру Channels (Каналы) в то время, когда активизирован режим работы Quick Mask (Быстрая маска), то заметите, что образовался новый дополнительный канал, в котором хранится информация о создаваемой маске в виде полутонового