领带冻结了子进程的产生

时间:2015-05-21 09:15:13

标签: windows perl cygwin tee

编辑:在评论后做了一些排序和更多解释

我编写了一个小型客户端 - 服务器应用程序,然后添加了最初工作的日志记录,现在让我的程序冻结。

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

我的程序是在Cygwin shell中启动的,为了使事情复杂化,我无法使用CPAN在我的环境中安装新模块。 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会执行他应该做的所有事情。

0 个答案:

没有答案