Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: стандартные потоки  (Прочитано 9580 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« : 30-10-2004 15:05 » 

Есть две программы, работающией со стандартными вводом и выводом (STDIN, STDOUT).

Можно ли в shell'е запустить их таким образом, чтобы циклически замкнуть друг на друга? Т.е. чтобы выход одной шёл на вход другой, и выход другой на вход первой. Если можно, то как?

Классический "трубопровод" замыкает вход второй на выход первой
Код:

$ ./prg1 | ./prg2

а чтобы ещё и наоборот?
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
comm
Гость
« Ответ #1 : 30-10-2004 21:15 » 

$ mknod  pipe1
$ mknod  pipe2
$ prg1 <pipe1 >pipe2 &
$ prg2 <pipe2 >pipe1 &

создаем трубы ручками, потом запускаем программы с редиректом потоков
теоретически должно работать
Записан
comm
Гость
« Ответ #2 : 30-10-2004 21:17 » 

для FreeBSD :  вместо mknod  использовать mkfifo
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 31-10-2004 10:01 » 

значит только через pip'ы... ладно, больше вопросов нет.

задача, собственно, выстроить цепочку программ, из которых самая нижняя решает некую задачу, а все промежуточные реализуют, скажем так, уровни протоколов, т.е. являются функциями преобразования входа в выход и наоборот и оболочками.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 03-11-2004 19:29 » 

Цитата: comm
$ mknod  pipe1
$ mknod  pipe2
$ prg1 <pipe1 >pipe2 &
$ prg2 <pipe2 >pipe1 &

создаем трубы ручками, потом запускаем программы с редиректом потоков
теоретически должно работать

Я бы назвал такой метод некоректным: если программа prg1 попытается сделать вывод раньше, чем к другому концу подключится prg2, то получит SIGPIPE. С односторонним вводом другая хрень - EOF.
Цитата
Once you have created a FIFO special file in this way, any process
can open it for reading or writing, in the same way as an ordinary file.
However, it has to be open at both ends simultaneously before you can
proceed to do any input or output operations on it.  Opening a FIFO for
reading normally blocks until some other process opens the same FIFO for
writing, and vice versa.

Потом, да же если соединить программы таким макаром, то при блокируемом io возможна взаимная блокировка на вводе.

Стоит смотреть в сторону pty. А так же подумать как избежать взаимных блокировок. Например, alarm() или select().
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 04-11-2004 08:16 » new

Ну если рассматривать проблему как общий подход, то да.

В моём же частном случае взаимных блокировок и т.п. не возникает, а зависания не страшны - ручное вмешательство через echo <команда> >> pipe помогает решить все вопросы. Собрано "на коленке" для решения частной одноразовой задачи.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines