Security Teams



:::
  Ответ в темуСоздание новой темыСоздание опроса

> Perl + pipes
nameless
Дата 18.02.2007 - 11:43
Цитировать сообщение
Offline



.:Тень:.
******

Профиль
Группа: -experts-
Сообщений: 1745
Пользователь №: 18
Регистрация: 19.02.2005



Рейтинг:
(90%) XXXXX


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


--------------------
Мы расправим крылья
PM
Top
drmist
Дата 18.02.2007 - 16:59
Цитировать сообщение
Offline



Professional
*****

Профиль
Группа: -users-
Сообщений: 1165
Пользователь №: 222
Регистрация: 14.04.2005



Рейтинг:
(0%) -----


vxk7m
Обычно пайпы открываются либо только на чтение либо только на запись. Чтобы делать и то и другое одновременно видимо нужны соответствующие классы - но в свое время (когда нуждался) таких не нашел.
Чтение из пайпа:
Код
open FID, "ls -la|";

и дальше как с обычным файлом, либо
Код
$str = `ls -la`;

По поводу записи запамятовал, кажется по анологии с open FID, ...


--------------------
Когда нельзя еще больше хочется...
PMСайт пользователя
Top
nameless
Дата 18.02.2007 - 21:07
Цитировать сообщение
Offline



.:Тень:.
******

Профиль
Группа: -experts-
Сообщений: 1745
Пользователь №: 18
Регистрация: 19.02.2005



Рейтинг:
(90%) XXXXX


Цитата
тобы делать и то и другое одновременно видимо нужны соответствующие классы

Досадно, это именно то, что мне нужно.


--------------------
Мы расправим крылья
PM
Top
Anarki
Дата 21.02.2007 - 13:10
Цитировать сообщение
Offline



.:k3wl k1dDie:.
***

Профиль
Группа: -users-
Сообщений: 217
Пользователь №: 59
Регистрация: 6.03.2005



Рейтинг:
(20%) X----


Взято из книжки Perl Cookbook
Код

#!/usr/bin/perl -w
# pipe5 - двусторонний обмен данными с использованием двух каналов
# без применения socketpair
use I0::Handle;
pipe(PARENT_RDR, CHILDJJTR);
plpe(CHILD_RDR, PARENT_WTR);
CHILD_WTR->autoflush(1);
PARENT_WTR->autoflush(1);
if ($pid = fork) {
close PARENT_RDR; close PARENT_WTR;
print CHILD_WTR "Parent Pid $$ is sending this\n";
chomp($line = );
print "Parent Pid $$ just read this: '$line'\n";
close CHILD_RDR;. close CHILD_WTR;
waitpid($pid,0);
} else {
die "cannot fork: $!" unless defined $pid;
close CHILD_RDR; close CHILD_WTR;
chomp($line = );
print "Child Pid $$ just read this: '$line'\n";
print PARENT_WTR "Child Pid $$ is sending this\n":
close PARENT_RDR; close PARENT_WTR;
exit;


существует специальная системная функция socketpair (см. пример 16.8), которая упрощает предыдущий пример. Она работает аналогично pipe, за исключением того, что оба манипулятора могут использоваться как для приема, так и для передачи.
Пример 16.8. pipe6
Код

#!/usr/bin/perl
# pipe6 - двусторонний обмен дпинмми г. применением socketpair
use Socket;
use IO::Handle;
# Мы говорим AF_UNIX, потому что хотя константа *_1_ОСА1_
# соответствует POSIX 1003.1g, на многих компьютерах
# она еще не поддерживается.
socketpair(CHILD, PARENT, AF_UNIX, SOCK_STREAM, PF_UNSPEC) or die "socketpair: $!";
CHILD->autoflush(1);
PARENT->autoflush(1);

if ($pid = fork) {
 close PARENT;
 print CHILD "Parent Pid $$ is sending this\n";
 chomp($line = <CHILD>);
 print "Parent Pid $$ just read this: '$line'\n";
 close CHILD;
 waitpid($pid,0);
} else {
 die "cannot fork: $!" unless defined $pid;
 close CHILD;
 chomp($line = <PARENT>);
 print "Child Pid $$ just read this: '$line'\n";
 print PARENT "Child Pid $$ is sending this\n";
 close PARENT;
 exit;
}

P.S. там только код подправить в нескольких местах, при распознавании криво буквы определились некоторые =)

Это сообщение отредактировал drmist - 6.03.2007 - 19:52
PMСайт пользователяICQ
Top
nameless
Дата 22.02.2007 - 09:00
Цитировать сообщение
Offline



.:Тень:.
******

Профиль
Группа: -experts-
Сообщений: 1745
Пользователь №: 18
Регистрация: 19.02.2005



Рейтинг:
(90%) XXXXX


Цитата
Пример 16.8. pipe6

Йопт, пасиба, чувак!!! Самое смешное что у меня есть эта книга, и я в неё чёт не посмотрел =)
ЗЫ ст. 669


--------------------
Мы расправим крылья
PM
Top
drmist
Дата 6.03.2007 - 20:02
Цитировать сообщение
Offline



Professional
*****

Профиль
Группа: -users-
Сообщений: 1165
Пользователь №: 222
Регистрация: 14.04.2005



Рейтинг:
(0%) -----


А как перенаправить ввод/вывод какого-нибудь процесса в один из хендлов, PARENT например?


--------------------
Когда нельзя еще больше хочется...
PMСайт пользователя
Top

Опции темы Ответ в темуСоздание новой темыСоздание опроса