如何生成一个与主要通道共享STDOUT通道(而不是其他任何通道)的新进程?

时间:2012-07-14 11:22:00

标签: perl spawn

我有一个软件,在某个时候等待命名管道上的输出。这个动作是阻塞的,我希望同时有一个加载图像。我想通过在while循环开始之前分配进程来实现这一目的。

my $pid = fork()

if (defined($pid) and $pid == 0) {
    show_animation();
    exit 0;
}

while ($return_line = $FIFO->getline) {
    # Process the output when it's ready
}

show_animation()将检查正在编写输出的脚本是否仍在运行,并在结束后立即结束。

不幸的是,这破坏了一切,因为分叉进程与主要进程共享同一个套接字和其他所有内容。并且ZeroMQ似乎不喜欢这样(程序一旦分叉,程序就会因ZeroMQ错误而中止)。

我一直在寻找像Proc::Spawn这样的模块让我在两个进程之间共享STDOUT通道。你有什么建议吗?你有更好的方法来实现这个目标吗?

2 个答案:

答案 0 :(得分:0)

fork()之后,你可以close()任何文件句柄,你不再需要了。

use POSIX qw( close _SC_OPEN_MAX sysconf );
use constant OPEN_MAX_FD => eval { sysconf(_SC_OPEN_MAX) } || 1024;

...

defined( my $kid = fork() ) or die "Cannot fork - $!";

if( $kid == 0 ) {
    # child
    $_ == 1 or close $_ for 0 .. OPEN_MAX_FD;

    ...

答案 1 :(得分:0)

感谢您的帮助,但我找到了一个完全适合我使用线程的问题的解决方案:

use threads;

my $loading_threads = threads->create(\&loading_animation, $process_name);
$loading_threads->detach();

在此之前我没有任何问题。