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


Автор: TDrive 8.9.2009, 15:42
есть скрипт который в начале работы создаёт например 20 процессов.
потом каждому процессу даёт задачу и ждёт.
когда какой нибудь процесс выполняет задачу он сообщает родительскому процессу что всё зделал.
родительский процесс даёт ему новую задачу.

выглядит это примерно вот так:
Код

use strict;

my @ParentWrite;
my @ParentRead;
my $quantity = 20;

# тут создаём процессы
for (my $i=0;$i<$quantity;$i++){
    pipe(ChildRead,$ParentWrite[$i]);
    pipe($ParentRead[$i],ChildWrite);
    if(fork()==0){
        while(1){
            syswrite(STDOUT,"child $i - $_ \n") if sysread(ChildRead,$_,1024);
            syswrite(ChildWrite,"yse gotovo");
            }
        }
    }
    
#тут мы их озадачиваем
for (my $i=0;$i<$quantity;$i++){
    syswrite($ParentWrite[$i],"test start");
    }
    
#тут проверяем как они работают и озадачиваем их снова
while(1){
    for (my $i=0;$i<$quantity;$i++){
        syswrite($ParentWrite[$i],"molodca!") if sysread($ParentRead[$i],$_,1024);
    }
}


в таком виде он работает НО syswread() если не может прочитать из дескриптора тормозится пока в дескрипторе не появятся данные.
тоесть скрипт работает потому что все процессы нормально работаю но если один процесс повиснет то главный процесс будет ждать от него ответа.

значит надо массив дескрипторов @ParentRead сделать неблокирующим.
знаю что надо use Fcntl; знаю что делает это fcntl() но вот с параметрами этой функции не могу разобраться.
ну первый параметр это дескриптор а другие 2 параметра вообще тёмный лес.... и описания нигде найти не могу.
может кто помочь разобраться?

(ещё можно вроде через метод blocking() но я стараюсь не использовать модули чтоб самому разобраться как чё работает)

кстате почему больше 64 процессов открыть нельзя?








  

Автор: TDrive 9.9.2009, 13:25
 smile  smile  smile 

Автор: ginnie 9.9.2009, 13:45
TDrive, может Вам поможет http://docstore.mik.ua/orelly/perl/cookbook/ch07_15.htm?

Автор: TDrive 9.9.2009, 15:21
Цитата(ginnie @  9.9.2009,  13:45 Найти цитируемый пост)
TDrive, может Вам поможет Doing Non-Blocking I/O? 

о спасиб то что надо дальше разберусь

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