• ベストアンサー

forkで作れる子プロセス数が限られている

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です。

質問者が選んだベストアンサー

  • ベストアンサー
  • guci-ok
  • ベストアンサー率33% (49/146)
回答No.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__

参考URL:
C:\Perl\html\site\lib\Win32\Process.html

その他の回答 (3)

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.3

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

  • guci-ok
  • ベストアンサー率33% (49/146)
回答No.2

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

ie000
質問者

補足

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

  • asuca
  • ベストアンサー率47% (11786/24626)
回答No.1

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

ie000
質問者

補足

ありがとうございます。

関連するQ&A

専門家に質問してみよう