I have this code that is supposedly creating n childs and n pipes (n given as an argument to the main) and what i am trying to do is to send a char* to a specified child using the convenient pipe throught read/write system calls and it's not actually working (i'm a newbie in system programming)
This is the main
int main(int argc, char const *argv[])
{
int tmp,np;
int tube[MAX_PROCESS][2], i;
pid_t pid[MAX_PROCESS];
char *chaine;
if(argc != 2){
perror("Error : nombre d'arguments est invalide\n");
exit(EXIT_FAILURE);
}
tmp = atoi(argv[1]);
if(tmp > 10){
fprintf(stderr,"Erreur : nombre de processus fils doit étre inférieure a %d", MAX_PROCESS);
exit(EXIT_FAILURE);
}
for(i=0;i<tmp;i++){
if(pipe(tube[i]) == -1){
perror("Erreur lors du création du tube");
exit(EXIT_FAILURE);
}
}
printf("fermeture des tubes de lecture dans le pere\n");
for(i=0; i < tmp; i++){
if(close(tube[i][TUBE_LECTURE]) == -1){
fprintf(stderr,"Erreur lors la fermeture de tube de lecture %d\n",i);
exit(EXIT_FAILURE);
}else
printf("tube %d fermé\n", i);
}
printf("lecture a partir du clavier d'une chaine et du numéro du fils voulu : \n");
chaine = (char*) malloc(sizeof(char));
if(scanf("%s %d", chaine, &np) != 2){
perror("Erreur de lecture de la chaine ou du numéro du processus fils\n");
exit(EXIT_FAILURE);
}
printf("création des fils...\n");
for(i=0; i<tmp; i++){
if((pid[i] = fork()) == -1){
perror("Erreur lors du création des fils");
exit(EXIT_FAILURE);
}
}
printf("Initialisation fonction 'fils'\n");
for(i=0;i<tmp;i++) {
if(pid[i] == 0)
fils(np,tmp,tube);
}
printf("ecriture dans le tube\n");
if(write(tube[np][TUBE_ECRITURE],chaine,sizeof(chaine)) == -1){
perror("Erreur ecriture dans le tube\n");
exit(EXIT_FAILURE);
}
/*fermeture des tubes d'écriture*/
for(i=0; i< tmp; i++){
if(close(tube[i][TUBE_ECRITURE]) == -1){
perror("Erreur lors la fermeture de tube de l'écriture\n");
exit(EXIT_FAILURE);
}
}
/*attente des fils*/
for(i=0;i<tmp;i++){
if(waitpid(pid[i],NULL, 0) == -1){
fprintf(stderr,"Erreur lors de l'attente du fils %d",i);
exit(EXIT_FAILURE);
}
else
printf("le fils %d a terminé\n", i);
}
printf("tous les fils ont terminé\n");
return EXIT_SUCCESS;
}
it's printing the following error :
fermeture des tubes de lecture dans le pere
tube 0 fermé
tube 1 fermé
tube 2 fermé
tube 3 fermé
lecture a partir du clavier d'une chaine et du numéro du fils voulu :
yassine
2
création des fils...
Initialisation fonction 'fils'
ecriture dans le tube
Initialisation fonction 'fils'
Initialisation fonction 'fils'
Erreur lors de la lecture Bad file descriptor
Erreur lors de la lecture Bad file descriptor
Initialisation fonction 'fils'
Erreur lors de la lecture Bad file descriptor
Initialisation fonction 'fils'
Erreur lors de la lecture Bad file descriptor
Initialisation fonction 'fils'
Erreur lors de la lecture Bad file descriptor
Initialisation fonction 'fils'
Erreur lors de la lecture Bad file descriptor
Initialisation fonction 'fils'
Erreur lors de la lecture Bad file descriptor
Initialisation fonction 'fils'
Initialisation fonction 'fils'
Erreur lors de la lecture Bad file descriptor
Initialisation fonction 'fils'
Erreur lors de la lecture Bad file descriptor
Erreur lors de la lecture Bad file descriptor
Initialisation fonction 'fils'
Initialisation fonction 'fils'
Erreur lors de la lecture Bad file descriptor
Initialisation fonction 'fils'
Erreur lors de la lecture Bad file descriptor
Initialisation fonction 'fils'
Erreur lors de la lecture Bad file descriptor
Initialisation fonction 'fils'
Erreur lors de la lecture Bad file descriptor
Erreur lors de la lecture Bad file descriptor