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 72 73 74 75 76 77 78 79 80
|
#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 */
void
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 (sigaction (SIGCHLD, &sa, NULL) != 0)
{
perror ("sigaction");
exit (EXIT_FAILURE);
}
}
void
tache_secondaire (int num)
{
int delay = 10 * num + 5;
printf ("%d:fils> Je suis le processus fils #%d (pere:%d), sleeping for %d\n", getpid (), num, getppid (), delay);
sleep (delay);
}
int
main (int argc, char *argv[])
{
int pidfils;
int i;
int nb_files = 13;
int nb_tasks;
/* Mise en place du gestionnaire de signaux */
install_sigaction ();
/* Boucle sur les fichiers */
nb_tasks = 0;
for (i = 0; i < nb_files; i++)
{
pidfils = fork ();
switch (pidfils)
{
case -1:
perror ("fork");
exit (EXIT_FAILURE);
case 0:
tache_secondaire (i);
exit (EXIT_SUCCESS);
}
nb_tasks++;
if (nb_tasks > MAX_PROCESS)
{
waitpid (-1, NULL, WUNTRACED);
nb_tasks--;
}
}
/* Programme principal exécuté par le père */
printf ("%d:pere> Je suis le processus père\n", getpid ());
exit (EXIT_SUCCESS);
} |
Partager