1

我有一个软件会在某个时候等待命名管道上的输出。这个动作是阻塞的,我想同时有一个加载图像。我正在考虑通过在 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 通道。你有什么建议吗?你有没有更好的方法来实现这一点?

4

2 回答 2

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;

    ...
于 2012-07-15T10:51:34.863 回答
0

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

use threads;

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

把这个放在之前我没有任何问题。

于 2012-07-15T12:17:50.633 回答