LINUX.ORG.RU

pipe+perl


0

0

Как можно посмотреть просто есть ли данные в трубе, а не ждать, пока они придут и только после этого продолжать выполнение...
на перле под Юниксом

код:
----------

open (PIPE, "-|") || exec("tail -n 0 -f ./file");
do {
my $i=readline(*PIPE);
...}
while (1)

----------

исполняет "..." только при получении каких-либо данных... а нужно постоянно исполнять это "...", даже если нет в трубе ничего...
И еще сразу, у Linux какой размер трубы, собственно...?

Спасибо!


select или poll в перле наверное есть.
Или дескриптор в асинхронный режим перевести.

Havoc ★★★★
()

man 1 perlfunc
Ищи select

select RBITS,WBITS,EBITS,TIMEOUT                         
        This calls the select(2) system call with the bit
        masks specified, which can be constructed using  
        `fileno' and `vec', along these lines:           
                                                         
            $rin = $win = $ein = '';                     
            vec($rin,fileno(STDIN),1) = 1;               
            vec($win,fileno(STDOUT),1) = 1;              
            $ein = $rin | $win;                          

Havoc ★★★★
()
Ответ на: комментарий от Havoc

Havoc спасибо. Прочитал я perlfunc но что-то яснее не стало... Можно чуток подробнее по поводу select ??

falcon
() автор топика

man 2 select

Там подробнее. Но при чтении из stdout у меня возникала проблема, что считалось, что данные есть только после того, как я на Enter нажму.
Причем что select, что poll.

Еще на C можно перевести дескриптор в асинхронный режим:
fcntl(fd, F_SETFL, O_NONBLOCK);
Про перл не скажу, ибо я его слабо знаю.

Тогда если данных нет, ты при чтении ошибку получишь.

Havoc ★★★★
()

Havoc спасибо.

falcon
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.