Tuna has asked for the wisdom of the Perl Monks concerning the following question:

Just a thought, monks. Would it be possible to spawn an external program, and then kill it when a directory contains N files?
  • Comment on Running external program until N files created

Replies are listed 'Best First'.
Re: Running external program until N files created
by japhy (Canon) on Mar 01, 2001 at 23:27 UTC
    Fork two extra processes (or maybe just one) -- one to run the application, and the other to monitor the directory contents.
    if ($proc_pid = fork) { # parent } elsif (defined $proc_pid) { exec $command, @args; die "can't exec $command @args: $!"; } else { die "can't fork: $!"; } if ($count_pid = fork) { # parent } elsif (defined $count_pid) { opendir DIR, $dir_to_be_watched or die "can't open $dir_to_be_watched: $!"; while (1) { # UPDATED -- who cares WHAT the files are? my $files = -2; # -2 for . and .. $files++ while defined readdir DIR; last if $files == $N; rewinddir DIR; } kill -TERM => $proc_pid; exit; } else { die "can't fork: $!"; } # parent can go on its merry way


    japhy -- Perl and Regex Hacker
      You may want to make that:     last if $files >= $N; or even     last if ++$files >= $N while readdir DIR; Otherwise, the directory could jump from <N to >N files and your script would miss it.
        Hmm, good point. Oh, but your second snippet is broken (since Perl doesn't allow multiple post-expression control modifiers).
        ++$files >= $N and last while defined readdir(DIR);
        And keep that defined in there. The files "0" and "" are valid, you know.

        japhy -- Perl and Regex Hacker