Perl, fork, семафоры, процессы

Мне нужно создать программу, которая запускала бы 3 процесса одновременно в случайной последовательности из списка и блокировала бы эти процессы семафором один за другим, чтобы избежать дублирования. Например, у вас есть список из 3 программ:

@array = ( 1,2,3);
  1. perl script.pl сначала запускает 2;
  2. Случайным образом пытается запустить 2 еще раз и получает ошибку (потому что 2 теперь заблокированы семафором).
  3. Выполняется 1.
  4. Выполняется 3.
  5. script.pl ожидает, что все 1,2,3 завершат работу, а затем закрывается.

Вот мой код на данный момент:

#!/usr/bin/perl -w
use IPC::SysV qw(IPC_PRIVATE S_IRUSR S_IWUSR IPC_CREAT);
use IPC::Semaphore;
use Carp ();

print "Program started\n";

sub sem {
    #semaphore lock code here
  }

sub chooseProgram{
    #initialise;
    my $program1 = "./program1.pl";
    my $program2 = "./program2.pl";
    my $program3 = "./program3.pl";
    my $ls = "ls";
    my @programs = ( $ls, $program1, $program2, $program3 );    

    my $random = $programs[int rand($#programs+1)];
    print $random."\n";
    return $random;
}

#parent should fork child;
#child should run random processes;
#avoid process clones with semaphore;
sub main{                   
    my $pid = fork();
    if ($pid){
        #parent here
    }
    elsif (defined($pid)){
        #child here     
        print "$$ Child started:\n";
        #simple cycle to launch and lock programs
        for (my $i = 0; $i<10; $i++){
            # semLock(system(chooseProgram()); #run in new terminal window
            # so launched programs are locked and cannot be launched again
        }
    }
    else {
        die("Cannot fork: $!\n");
    } 
    waitpid($pid, 0);
    my $status = $?;
    #print $status."\n";
}
main();
exit 0;

Проблемы:

  1. Необходимо файл блокировки; (Я не знаю, как работать с семафором. Не удалось несколько попыток заблокировать файлы, поэтому исключен этот код.)
  2. Ребенок ждет завершения первой программы перед вторым запуском. Как я могу запустить три программы одновременно с одним ребенком? (Возможно ли, или мне следует создать одного ребенка для одной программы?)
  3. Программы не являются графическими и должны запускаться в терминале. Как запустить программу в новом окне терминала (вкладка)?
  4. Нет правильной проверки, все ли программы @programs еще были запущены. -- менее важно.
5
задан Bill the Lizard 17 December 2012 в 14:36
поделиться