Bonjour !!

Voila je tente de faire executer 4 processus en parallèle, le tout à l'aide de sémaphores, pour gérer le nombre de processus en même temps.

Pour etre plus clair, j'aimerais qu'il n'y ait que 2 processus qui s'exécutent en même temps.

J'ai donc créé un ensemble de sémaphores, et lancer l'exécution de 4 scripts via une table AT... Le code étant souvent plus explicite :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#/usr/local/bin/perl
 
$IPC_KEY = 1234;
$id = semget(1234,  2 , IPC_CREAT);
 
 
$action = "/home/mbe/test/threads/bonjour.pl 1\n";
$action .= "/home/mbe/test/threads/bonjour.pl 2\n";
$action .= "/home/mbe/test/threads/bonjour.pl 3\n";
$action .= "/home/mbe/test/threads/bonjour.pl 4\n";
 
$fich_crontab = "/home/mbe/test/threads/crontab";
 
open (FIC,">$fich_crontab")|| die "Probleme d'ouverture";
print FIC ($action."\n")   || die "Probleme d'ecriture";
close FIC;
 
system "at now < $fich_crontab > /dev/null";
Petite description rapide du script bonjour.pl :
Il se contente d'écrire en boucle pendant un peu de temps dans un fichier, et rend la main :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#!/usr/local/bin/perl
 
use strict;
 
my $param = $ARGV[0];
 
my $i = 0;
my $cptSec = 0;
 
my ($sec, $min, $heure, $jourM, $mois, $annee) = localtime(time);
open (FIC, ">>/home/mbe/test/threads/rapports/test_".$param.".txt");
print FIC "commencé a $heure:$min:$sec \n";
 
my $sem_op_P = pack("s!3", 0, -1, 0);
my $sem_op_V = pack("s!3", 0, 1, 0);
 
# Recup de l'ensemble de semaphores
#my $id = semget(1234,  0, 0);
 
# On demande la ressource
semop(1234, $sem_op_P);
 
while ($i < 10) {
 
	($sec, $min, $heure, $jourM, $mois, $annee) = localtime(time);
	print FIC "J'ai ecrit a $heure:$min:$sec  \n";
	$cptSec += 10*$i;
	sleep (5);
	$i++;
}
 
($sec, $min, $heure, $jourM, $mois, $annee) = localtime(time);
print FIC "terminé a $heure:$min:$sec \n";
close FIC;
 
# On libère la ressource
semop(1234, $sem_op_V);


Voilà mon problème : mes processus/scripts s'exécutent l'un après l'autre. Et dans mes fichiers, l'heure de fin du fichier précédent "terminé à" correspond à l'heure du début du script en cours "commencé à", ce qui prouve bien l'exécution l'un après l'autre.



D'où ma question : pourquoi ?

Est ce que ca vient en fait de la table AT qui les exécutent chacun leur tour ? Ou est ce que ca vient en fait des mes semaphores qui sont mal gérés ?

Merci beaucoup d'avance !