Tie冻结subprocess的产生

编辑:做了一些sorting和更多的解释后的意见

我编写了一个小型的客户端 – 服务器应用程序,然后添加了日志,刚开始工作,现在让我的程序冻结。

服务器启动一些subprocess,通过套接字与服务器进行通信。

我的程序是在Cygwin shell中启动的,并且使事情更加复杂,我不能使用CPAN在我的环境中安装新的模块。 IO::TeeTee没有安装。

我用的日志logging

服务器

 open (STDOUT, "|/bin/tee $logfile"); Init(); 

最初似乎工作正常。 除了子function之外,这个被称为服务器中的第一行

所以我的服务器做了一些子程序

服务器::初始化

 OpenSockets(); CreateMatrix(); PrintMatrix(); StartClients(); 

我的服务器做一些分叉和计算,然后结束subprocess; 那么还有更多的计算。

后来我开始与我的客户

服务器:: StartClients

 foreach my $server ( @servers ) { foreach my $feature( @features ) { if ( $hasserverlicense{$server}{$feature} ) { PrintTimed("Client started for $feature \@ $server"); system("perl w:/lma/client.pl $server $feature &"); } } } 

发球和STDOUT的工作,直到StartClients,基本上是上面的代码和卡住。 CreateMatrix是一个子分叉完成,但所有分叉的东西也结束了。

服务器:: CreateMatrix

 my $pipes = IO::Select->new(); foreach my $server (@servers) { foreach my $feature (@features) { # FORKING HAPPENS HERE my $pipe = IO::Pipe->new; my $pid; if ( $pid = fork ) { #PARENT #save pipe $pipe->reader; $pipes->add($pipe); } elsif ( defined $pid ) { #CHILDREN #set pipe $pipe->writer; select $pipe; .... backticks command and Evaluation here .... print ("$ans"); exit; } } } #THIS IS PARENT PROCESS while($pipes->count()){ my @pipes = $pipes->can_read(); foreach my $pipe (@pipes) { ... processing of read from pipe ... $pipes->remove($pipe); } } #CHILDS EXIT AFTER THIS, NO MORE FORKING IS DONE #AFTER THIS, ONLY BACKTICKS OPERATIONS IN OTHER ROUTINES 

所以我的孩子们不应该搞砸我的STDOUT,无论如何,服务器继续,仍然打印。 另外,客户不使用STDOUT

客户

 while(1){ ... backticks op, editing and generating $ans ... # Opening Connection and sending answer $socket = new IO::Socket::INET (.....) die unless $socket; $socket->send("$ans"); $socket->shutdown(1); $socket->close(); } 

所以有什么问题? 服务器没有问题,直到SERVER :: StartClients在正常情况下,应该启动大约八个客户端。 启用T恤时,会启动两到四个客户端,然后不再发生任何事情:一切都卡住了,Perl进程不再响应。 没有更多的输出写入控制台。 如果我注释掉

 #open (STDOUT, "|/bin/tee $logfile"); 

一切工作再好,所有的客户端都启动,服务器做他应该做的一切。