• [^] # Re: Quelques problèmes

    Posté par . En réponse au message introduire redirection dans un minishell. Évalué à 1.

    J'oubliais : je pense que tu t'es quelques peu emmêlé les pinceaux au niveau des if et, ce qui n'aide pas, l'indentation n'est pas correcte. Le code après le commentaire "//enfant: exec du programme" n'a rien à faire là, il devrait être dans la clause "else" du if(tmp)... Bref en pseudo code ton programme devrait avoir cette structure:

    main() {
     while(lire_entree()) {
     parse_commande();
     if (entree_valide) {
     do_exec()
     wait(pid)
     }
     }
    }
    do_exec() {
     pid = fork()
     if(pid) { // pere
     return pid;
     }
     else {
     set_stdio();
     for(dir in path)
     exec();
     // not found
     print("command not found")
     exit()
     }
     return 0; // non atteint
    }

    Ensuite tu as 3 options pour passer tous les paramètres: soit tu utilises des globales, le plus simple dans un premier temps mais le moins facilement "maintenable"; soit tu passes tous les arguments (éventuellement par références), par exemple `pid_t do_exec(const char* bin, const char* stdin, enum redir_mode stdin_redir, const char* stdout, enum redir_mode stdout_redir), soit tu mets tout dans une structure genre "struct commande { const char* binary; ...}". C'est cette dernière méthode que je te conseillerais. Tu pourrais avoir alors le corps de ta boucle qui ressemblerait à "struct commande* cmd = parse_commande(); if (cmd) { ... //commande_valide... do_exec(cmd); wait(pid); free(cmd);}" ce qui me semble assez lisible. Enfin bon ça dépend un peu du style que l'on vous a conseillé au cours...