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 :
Petite description rapide du script bonjour.pl :
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";
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 !
Partager