Автор Тема: Глобальные переменные и fork  (Прочитано 8146 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Wells

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 15
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Глобальные переменные и fork
« : 26 Октября 2004, 17:17:29 »
Есть глобальная переменная. Как из процесса-потомка, вызванного через fork, записать в неё какое-то значение? (Всё под Windows)

Оффлайн NeoNox

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3012
  • +0/-0
  • 0
    • Просмотр профиля
Глобальные переменные и fork
« Ответ #1 : 26 Октября 2004, 17:28:58 »
А в чем загвоздка?
The documentations is your friend

Оффлайн Wells

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 15
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Глобальные переменные и fork
« Ответ #2 : 26 Октября 2004, 18:34:49 »
Есть следующий код:

use strict;
use Benchmark;
my $tmStamp1 = new Benchmark;
#/////////////////////////////////////////////////////////////////////////////////
$| = 1;
my $threads = 5;
my @pids;
my $isExit = 0;
#/////////////////////////////////////////////////////////////////////////////////
for (1 .. $threads) {
makeChild();
}
print "$isExit\\n";
for (my $i = 0; $i <= ($threads-1); $i++) {
print "$pids[$i]\\n";
waitpid($pids[$i], 0);
}
print "$isExit\\n";
#/////////////////////////////////////////////////////////////////////////////////
my $tmStamp2 = new Benchmark;
my $tmDiffer = timediff($tmStamp1, $tmStamp2);
print timestr($tmDiffer);
#/////////////////////////////////////////////////////////////////////////////////
sub makeChild {
my $pid;
die "fork: $!" unless defined ($pid = fork);
if ($pid) {
push(@pids,$pid);
return;
}
else {
my $i = 0;
for ($i; $i<=10 ; $i++) {
Time::HiRes::sleep(1.0);
}
$isExit = 1;
exit(0);
}
}
#/////////////////////////////////////////////////////////////////////////////////

Так вот $isExit не меняется перед выходом из скрипта

Оффлайн NeoNox

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3012
  • +0/-0
  • 0
    • Просмотр профиля
Глобальные переменные и fork
« Ответ #3 : 26 Октября 2004, 19:02:19 »
Wells а с какой радости он должен меняться?
Вместо того что-бы вываливать кучу ненужного кода разобрался бы в сабе с fork.
The documentations is your friend

Оффлайн NeoNox

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3012
  • +0/-0
  • 0
    • Просмотр профиля
Глобальные переменные и fork
« Ответ #4 : 26 Октября 2004, 19:03:38 »
Вот тебе для внекласного чтения:
use IO::Handle;
use 
strict;
my ($line$pid);
autoflush STDOUT;

if (
$pid open(CHILD"-|")) {
    
chomp($line = <CHILD>);
    print 
$line;
    
close(CHILD);
} else {
    die 
"cannot fork: $!" unless defined $pid;
    print 
STDOUT "4"#This value will be sent to $line
    
exit;
}
The documentations is your friend

Оффлайн Wells

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 15
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Глобальные переменные и fork
« Ответ #5 : 27 Октября 2004, 09:34:20 »
Если бы я сам мог разобраться - сюда не писал бы!!!!
To NeoNox: твой код выдаёт:
\'-\' is not recognized as an internal or external command,
operable program or batch file.
P.S. И какой это я "ненужный" код "вывалил"? Я "вывалил" свой скрипт! И всё!

Оффлайн arto

  • Ветеран
  • *****
  • Сообщений: 699
  • +0/-0
  • 2
    • Просмотр профиля
Глобальные переменные и fork
« Ответ #6 : 27 Октября 2004, 11:34:08 »
perldoc perlipc

Оффлайн NeoNox

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3012
  • +0/-0
  • 0
    • Просмотр профиля
Глобальные переменные и fork
« Ответ #7 : 27 Октября 2004, 11:34:56 »
Wells
Цитировать
Wells:
И какой это я "ненужный" код "вывалил"?

У тебя непонимание принципа fork.
Строки c 1 по 23 не имеют к твоей проблеме ни малейшего отношения.
Читать
perldoc -f fork
perldoc perlipc
до того как применять мое решение.
Цитировать
Wells:
To NeoNox: твой код выдаёт:

Да, я не учел что ты под виндовсом.
Вот исправленный вариант:
use IO::Handle;
use 
strict;
pipe(READERWRITER);
autoflush WRITER;
my ($pid,  $line);

if (
$pid fork) {
    
close WRITER;
    
chomp($line = <READER>);
    print 
$line;
    
close READER;
    
waitpid($pid,0);
} else {
    die 
"cannot fork: $!" unless defined $pid;
    
close READER;
    print 
WRITER "4"#This value will be sent to $line
    
close WRITER;  # this will happen anyway
    
exit;
}
The documentations is your friend

Оффлайн Wells

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 15
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Глобальные переменные и fork
« Ответ #8 : 27 Октября 2004, 15:44:41 »
To NeoNox: Всё работает! Спасибо! Только я вот не зря весь кусок кода вывалил. У меня там есть цикл, в котором 5 раз вызываются потомки. Так вот, как в конце проверить записал потомок что-то или нет? С одним потомком всё работает! А как с пятью быть???

Оффлайн NeoNox

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3012
  • +0/-0
  • 0
    • Просмотр профиля
Глобальные переменные и fork
« Ответ #9 : 27 Октября 2004, 16:24:42 »
Ну так напиши, в чем проблема?
Или мне все за тебя написать?
The documentations is your friend

Оффлайн Wells

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 15
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Глобальные переменные и fork
« Ответ #10 : 27 Октября 2004, 16:30:07 »
To NeoNox: Я понимаю - ты профи и для тебя это туфта, но у меня ничерта не получается! Вот так не работает:

use IO::Handle;
use strict;
my $threads = 5;
pipe(READER, WRITER);
autoflush WRITER;
my ($pid,  $line);
my $threads = 5;
for (my $i = 1; $i <= ($threads); $i++) {
if ($pid = fork) {
    close WRITER;
    chomp($line = );
    #print $line;
    close READER;
    waitpid($pid,0);
}
else {
    die "cannot fork: $!" unless defined $pid;
    close READER;
    print WRITER "4"; #This value will be sent to $line
    close WRITER;  # this will happen anyway
    exit;
}
}
print $line;

Оффлайн NeoNox

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3012
  • +0/-0
  • 0
    • Просмотр профиля
Глобальные переменные и fork
« Ответ #11 : 27 Октября 2004, 16:57:42 »
Лень это хорошо, но понимание сути вопроса - еще лучше.
Перенеси
pipe(READER, WRITER);
autoflush WRITER;
внутрь цикла.
The documentations is your friend

Оффлайн Wells

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 15
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Глобальные переменные и fork
« Ответ #12 : 27 Октября 2004, 18:41:24 »
В том то и вопрос, что если в процессе потомке что-то делать, то распаралеливание процессов не получается. Например если в ветку else засунуть

my $i = 0;
for ($i; $i<=10 ; $i++) {
   Time::HiRes::sleep(1.0);
}

то весь скрипт выполняется в пять раз дольше!!!

Оффлайн NeoNox

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3012
  • +0/-0
  • 0
    • Просмотр профиля
Глобальные переменные и fork
« Ответ #13 : 27 Октября 2004, 19:11:17 »
Wells правильно. а ты что хотел от так написанной программы?
Напиши на бумаге логику что должно произойти, а потом напиши это на Perl. Будут вопросы, сначала полностью логику сюда, а потом будем разбираться дальше.
The documentations is your friend

Оффлайн NeoNox

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3012
  • +0/-0
  • 0
    • Просмотр профиля
Глобальные переменные и fork
« Ответ #14 : 27 Октября 2004, 19:17:34 »
1. читаем вдумчиво perldoc -f fork
2. пишем комментарий к каждой строчке в твоей программе
The documentations is your friend

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28