Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Системное программирование > Как одновременно читать и пайп и сокет?


Автор: loginn 31.8.2011, 17:09
в рамках одного процесса (без порождения потоков) нужно читать и пайп и сокет...
я использовал такую конструкцию, компилятор не ругнулся, но она работает только для того, что перед оператором OR:

Код

...
socketpair(CHILD, PARENT, 1, 1, 0) or  die "socketpair: $!";
select((select(PARENT), $|=1)[0]);
select((select(CHILD), $|=1)[0]);
...

if ($pid=fork()) {
  ...
}
else {
  open $pipe, "-|", "/usr/bin/tail", "-f", "/ramdisk/logs/$site/access.log";
  ...
  while ((defined ($command=<PARENT>)) or (defined ($msg=<$pipe>))) {
  ...
}
  ...
}


Так вот, если перед OR стоит $command=<PARENT> - то читается только PARENT, если перед OR стоит $msg=<$pipe>, то читатется только $pipe

Есть ли возможность в перле сделать подобное БЕЗ расщепления на 2 потока, где в каждом потоке свой цикл while, читадщий из нужного дескриптора?

Автор: sir_nuf_nuf 1.9.2011, 09:39
Вам нужно мультепликсирование ввода вывода.

perldoc IO::Select

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)