我有一个软件,在某个时候等待命名管道上的输出。这个动作是阻塞的,我希望同时有一个加载图像。我想通过在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通道。你有什么建议吗?你有更好的方法来实现这个目标吗?
答案 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();
在此之前我没有任何问题。