Bonjour à tous,
Je n'ai pas de problème particulier avec le code que j'ai écrit (il compile et s'exécute correctement), mais je souhaiterais quand même avoir votre avis sur la qualité de celui-ci…
Contexte
On dispose de trois fichiers-texte A, B et C contenant respectivement les chaînes "contenu_a", "contenu_b" et "contenu_c". On passe le chemin absolu de chacun de ces fichiers à l'exécutable, grâce à la commande './exe chemin_a chemin_b chemin_c'.
Il faut que le programme affiche en parallèle sur la sortie standard leur contenu. Chaque fichier sera pris en charge par un processus distinct.
Ma solution (qui marche)
… et qui est commentée.
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 | int main(int argc, char* argv[]) { pid_t pid; // Contains either 0 (ie. : a process-child) or the process-ID of the last created process-child int i = 1; // Counts files (there are 3 files) for(i; i < argc; i++) { pid = fork(); // 3 processes are created if(pid == 0) { // if it's a child, pid is set to 0 and the next instruction would be a new loop without this break. So we write this break ! Thus, children won't create processes. break; } } // So now we have 4 processes : the parent + 3 children ones. if(pid == 0) { // If the current process is a child one, we read and print its file's content (1 child is associated with 1 file because of the variable `i`) FILE* file = fopen(argv[i], "r"); if(file == NULL) { perror("Open"); return -1; } int char_read = 0; while(char_read != EOF) { char_read = fgetc(file); printf("%c", char_read); } if(fclose(file) != 0) { perror("Close"); return -2; } printf("\n\n"); } if(pid != 0) { // If we are the parent process, we wait for its children ones' ending wait(NULL); } return 0; } |
Ma question
Donc comme je l'ai déjà dit, ce code compile, s'exécute et fait bien ce qu'on lui demande.
Cependant, avez-vous des remarques à faire ? Notamment, le break
et sa condition vous paraissent-ils OK ? Est-ce que les développeurs C procéderaient bien de cette manière ou ma solution est un peu "exotique/originale" ?
Voilà voilà, merci d'avance, bonne soirée à vous.