编辑:在评论后做了一些排序和更多解释
我编写了一个小型客户端 - 服务器应用程序,然后添加了最初工作的日志记录,现在让我的程序冻结。
服务器启动一些子进程,这些子进程通过套接字与服务器进行通信。
我的程序是在Cygwin shell中启动的,为了使事情复杂化,我无法使用CPAN在我的环境中安装新模块。 3}}和IO::Tee
未安装。
对于我使用的日志
服务器
open (STDOUT, "|/bin/tee $logfile");
Init();
起初似乎工作正常。 除了子功能之外,这个被称为服务器中的第一行之一
所以我的服务器做了一些子程序
服务器::初始化
OpenSockets();
CreateMatrix();
PrintMatrix();
StartClients();
我的服务器执行一些分叉和计算,然后结束子进程;然后还有一些计算。
稍后我用
启动我的客户服务器:: 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 &");
}
}
}
tee和STDOUT一直工作到StartClients,基本上是上面的代码和卡住的代码。 CreateMatrix是一个Sub,其中分叉已经完成,但所有分叉的东西也在那里结束。
服务器:: 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 在正常情况下,应该启动大约八个客户端。启用tee时,启动两到四个客户端,然后不再发生任何事情:一切都被卡住,Perl进程不再响应。没有更多输出写入控制台。如果我发表评论
#open (STDOUT, "|/bin/tee $logfile");
一切正常,所有客户端都已启动,Server会执行他应该做的所有事情。