Je sais que ce genre de questions a déjà été posé, mais leur niveau est clairement supérieur au mien, je n'ai toujours pas compris après avoir lu leur message, alors j'ai décidé de reposer cette question ici.
Je suis en train d'apprendre la communication multi-processus à l'aide de pipe, j'ai été confronté à cette erreur appelée Bad file descriptors, je ne comprends pas pourquoi j'ai cette erreur dans mon code.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <string.h>
#define SIZE 50
struct record {
int freq;
char word[SIZE];
};
int main(){
int number_process = 3;
int pipes[number_process][2];
struct record r1;
r1.freq = 10;
strcpy(r1.word, "Cat");
struct record r2;
r2.freq = 20;
strcpy(r2.word, "Elephant");
struct record r3;
r3.freq = 30;
strcpy(r3.word, "Dragon");
struct record records_array[3] = {r1, r2, r3};
for (int i = 0; i < number_process; i++){
if (pipe(pipes[i]) == -1){
perror("pipe");
exit(1);
}
// Create children.
pid_t fork_result = fork();
if (fork_result == -1){
perror("Parent fork");
exit(1);
} else if (fork_result == 0){
if (close(pipes[i][0]) == -1){
perror("Child closes reading port");
exit(1);
}
// Later children is going to close all reading port from pipe that parent creates.
for (int child_no = 0; child_no < i; child_no++) {
if (close(pipes[child_no][0]) == -1) {
perror("close reading ends of previously forked children");
exit(1);
}
}
// Now, I am trying to write each strct record member from the above array into the pipe
// when I run the program, it won't allow me to do so because of bad file descriptor exception.
for (int j = 0; j < number_process; i++){
if (write(pipes[i][1], &(records_array[j]), sizeof(struct record)) == -1){
perror("write from child to pipe");
exit(1);
}
}
// Finishing writing, close the writing end in pipe.
if (close(pipes[i][1]) == -1){
perror("Child closes writing port");
exit(1);
}
// Terminate the process.
exit(0);
} else {
// Parent is closing all the writing ends in pipe.
if (close(pipes[i][1]) == -1){
perror("Parent close writing");
exit(1);
}
}
}
return 0;
}
Lorsque je termine la compilation et que j'exécute l'exécutable, il m'indique simplement qu'un mauvais descripteur de fichier s'est produit. J'ai essayé d'utiliser gdb pour voir de plus près où cette erreur pouvait se produire, et je remarque que gdb signale cette erreur avant même que j'appelle write().
Je me sens complètement perdu dans ce concept de "write and pipe", quelqu'un peut-il gentiment m'expliquer ce que j'ai fait de mal quelque part dans le processus ?