编辑:做了一些sorting和更多的解释后的意见
我编写了一个小型的客户端 – 服务器应用程序,然后添加了日志,刚开始工作,现在让我的程序冻结。
服务器启动一些subprocess,通过套接字与服务器进行通信。
我的程序是在Cygwin shell中启动的,并且使事情更加复杂,我不能使用CPAN在我的环境中安装新的模块。 IO::Tee
和Tee
没有安装。
我用的日志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");
一切工作再好,所有的客户端都启动,服务器做他应该做的一切。