Bonjour,
Je suis en train d'essayer de paralléliser un programme qui traite séquentiellement un grand nombre de fichiers.
Pour cela, je vais utiliser la commande fork().
De plus, le nombre de taches tournant en même temps sera faible, en tout cas inférieur à 10.
Dès qu'une tache se terminera, une autre sera lancée, jusqu'à traitement de tous les fichiers.
J'ai commencé à écrire cela (cf. plus bas).
Mais je crains plus que tout la prolifération de processus zombies.
Quelqu'un peut-il me dire si ce code (ce n'est qu'un début) est correct ?
Merci.
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #define MAX_PROCESS 4 /* Balayette à zombies */ void sigchld_handler (int signal) { while (0 < waitpid (-1, NULL, WNOHANG)) ; } /* Mise en place du gestionnaire de signaux */ int install_sigaction (void) { struct sigaction sa; memset (&sa, 0, sizeof (sa)); sa.sa_handler = sigchld_handler; sa.sa_flags = 0; sigemptyset (&(sa.sa_mask)); if (0 != sigaction (SIGCHLD, &sa, NULL)) return -1; return 0; } void tache_secondaire (int num) { printf ("%d:fils> Je suis le processus fils (père:%d)\n", getpid (), getppid ()); sleep (10 * num + 5); } int main (int argc, char *argv[]) { int pidfils; int i; /* Mise en place du gestionnaire de signaux */ if (-1 == install_sigaction ()) { fprintf (stderr, "Problème avec sigaction()\n"); exit (EXIT_FAILURE); } for (i = 0; i < MAX_PROCESS; i++) { pidfils = fork (); switch (pidfils) { case -1: fprintf (stderr, "fork() a échoué\n"); exit (EXIT_FAILURE); case 0: tache_secondaire (i); exit (EXIT_SUCCESS); } } /* Programme principal exécuté par le père */ printf ("%d:pere> Je suis le processus père\n", getpid ()); exit (EXIT_SUCCESS); }
Partager