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 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161
| #include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <string.h>
#include <errno.h>
# define MAX 512
/* gestionnaire de signal */
void gestionnaire( int sig )
{
printf( ">>> Interception du signal %d (%s) !!!\n",sig, sys_siglist[sig]);
exit(EXIT_SUCCESS);
}
/*fonction fille*/
void fille(void)
{
pid_t pid_1, pid_2, pid_3;
int lu2,lu3;
int pfd[2];
char a [MAX];
char b [MAX];
close(pfd[1]);
if (signal(SIGINT, &gestionnaire) == SIG_ERR) // installe le gestionnaire du signal SIGINT
{
printf( " **** Fille => ERREUR : gestionnaire de signal non installe !! **** \n" );
}
signal(SIGINT, gestionnaire); //Interception de SIGINT avec la fonction "gestionnaire"
printf( " **** Fille : pid=%d, ppid = %d **** \n", getpid(), getppid() );
if(pid_1 == 0)
{
lu2 = read(pfd[0],&a,sizeof(a)); //lecture du pipe dans la chaine a
pid_2 = atoi(a);
printf("Ma soeur fille2 a pour pid %d\n", lu2); //On récupère et on affiche le pid 2
lu3 = read(pfd[0],&b,sizeof(b)); //lecture du pipe dans la chaine b
printf("Ma soeur fille3 a pour pid %d\n", lu3); //On récupère et on affiche le pid 3
//printf("pid %s\n",atoi(lu3));
}
if(pid_3 == 0)
{
lu2 = read(pfd[0],&a, sizeof(a));
printf("Ma soeur fille2 a pour pid %d\n", lu2);
}
pause(); //Attente du signal de la mère
printf( " *** FIN de la Fille ***\n" );
// exit(EXIT_SUCCESS);
}
//Programme principal
int main(int argc, char** argv)
{
int pfd[2];
pid_t pid_1, pid_2, pid_3;
int lu2,lu3;
char a [MAX];
char b [MAX];
// Création du pipe
if(pipe(pfd) == -1)
{
perror("pipe");
exit(1);
}
else
printf("Le pipe est créé \n");
//Mere
/* creation du 1er processus fille */
pid_1 = fork();
//Gestion des erreurs
if ( pid_1 < 0 )
{
printf( " le 1er fork() a echoue !!!\n" );
exit(-1);
}
//Creation de la 1er fille
else if ( pid_1 == 0 )
{
fille();
}
/* creation du 2eme processus fille */
pid_2 = fork();
//Gestion des erreurs
if ( pid_2 < 0 )
{
printf( " le 2eme fork() a echoue !!!\n" );
exit(-1);
}
//Creation de la seconde fille
else if ( pid_2 == 0 )
{
write(a,&pid_2,sizeof(a));
//sprintf(a,"%d",pid_2);
//sprintf(b,"%d",pid_3);
fille();
}
/* creation du 3eme processus fille */
pid_3 = fork();
//Gestion des erreurs
if ( pid_3 < 0 )
{
printf( " le 3eme fork() a echoue !!!\n" );
exit(-1);
}
//Creation de la troisième fille
else if ( pid_3 == 0 )
{
//sprintf(a,"%d",pid_2);
fille();
}
sleep(3);
close(pfd[0]);
// write(a,&pid_2,4);
//sprintf(b,"%d",pid_3);
//sprintf(a,"%d",pid_2);
kill(pid_1, SIGINT); //On tue le pid 1 du signal SIGINT
kill(pid_2, SIGINT); //On tue le pid 2 du signal SIGINT
kill(pid_3, SIGINT); //On tue le pid 3 du signal SIGINT
waitpid(pid_1, pid_2, pid_3);
sleep(3);
printf("Fin de la mère\n");
exit(0);
} |
Partager