プロが教える店舗&オフィスのセキュリティ対策術

for($i=0;$i<1000;$i++) {
if($p=fork) {
next;
} elsif(defined($p)) {
sleep 10000;
exit;
} else {
print("$i\n");
<STDIN>;
}
}


数十個で子プロセスが生成されなくなります
メモリは十分あまってます
デスクトップヒープ領域が足りなくなったわけじゃなさそうです
どうすればメモリが足りる限り子プロセスを生成できるでしょうか?
windows xp avtive perl 5.8.7です。

A 回答 (4件)

forkと同じではないですが、Win32::Processはどうでしょう。


以下のスクリプトは100のプロセスを起動できているみたいです。

D:\@ai\@Perl\Process>test1.pl M
3780 start...
3824 start...
3664 start...
3620 start...
1124 start...

#!Perl

use Win32::Process;
use Win32;
sub ErrorReport{
print Win32::FormatMessage( Win32::GetLastError() );
}

my $param = shift;
my @proc;

if ($param eq "M") {
for (1..100) {
my $ProcessObj;
Win32::Process::Create($ProcessObj,
"C:\\Perl\\bin\\perl.exe",
"perl test1.pl",
0,
NORMAL_PRIORITY_CLASS,
".")|| die ErrorReport();
push @proc => $ProcessObj
}
} else {
print "$$ start...\n";
sleep 60;
print "$$ end\n";
}

__END__
    • good
    • 0

>具体的な解決方法はないのでしょうか?


この制約は1つのプロセスが生成出来るプロセスの上限を64にしているところからきていると思います。
もし、この64を他の値に変更する方法がない場合、以下の方法を採られてはいかがでしょうか。
1案、プロセスを生成するスクリプトをプロセスを複数立ち上げる。nプロセス立ち上げれば、n×64個生成できます。
2案、子プロセスが更に、親プロセスと同じ事(プロセスの生成)を行うようにする。
    • good
    • 0

64(に近い数字)が最大です。


これは、使われているWindowsのAPIの制限です。
(今、すぐにこのAPIの名前が出てきませんが)
Perl-Win32のメーリングリストで流れていました。

この回答への補足

ありがとうございます
具体的な解決方法はないのでしょうか?

補足日時:2005/10/03 06:32
    • good
    • 0

プロセス表の利用者のエントリ数の上限によって制限されているのではなかったかと思います。

この回答への補足

ありがとうございます。

補足日時:2005/10/03 06:32
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!