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エラーで中止されます)。

2つのプロセス間でSTDOUTチャネルを共有できるProc::Spawnのようなモジュールを探していました。何か提案はありますか?これを達成するためのより良い方法はありますか?

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 に答える