Forum Linux.débutant Comment intégrer les modifications au mini-shell

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
-6
30
déc.
2015

bonjour,

un petit shell simple se compose des deux fichiers decouper.c et minishell.c (fichiers joints) ;
comment apporter les modifications suivants;
Les processus en arrière plan
La commande cd
Les redirections d'entrées-sorties vers des fichiers (avec >, >> et < au moins).
Les pipes (y compris l’enchaînement de deux pipes comme dans ls | cat | wc).
merci de m'aider !

bonnes fêtes !

cordialement

/* decouper.c
 Un wrapper autour de strtok
*/
# include <stdio.h>
# include <string.h>

/* decouper  --  decouper une chaine en mots */
int
decouper(char * ligne, char * separ, char * mot[], int maxmot){
  int i;

  mot[0] = strtok(ligne, separ);
  for(i = 1; mot[i - 1] != NULL; i++){
    if (i == maxmot){
      fprintf(stderr, "Erreur dans la fonction decouper: trop de mots\n");
      mot[i - 1] = NULL;
      break;
    }
    mot[i] = strtok(NULL, separ);
  }
  return i;
}

# ifdef TEST
int
main(int ac, char * av[]){
  char *elem[10];
  int i;

  if (ac < 3){
    fprintf(stderr, "usage: %s phrase separ\n", av[0]);
    return 1;
  }

  printf("On decoupe '%s' suivant les '%s' :\n", av[1], av[2]);
  decouper(av[1], av[2], elem, 10);

  for(i = 0; elem[i] != 0; i++)
    printf("%d : %s\n", i, elem[i]);

  return 0;
}
# endif

/* minishell.c

  Un shell elementaire (fork + exec et c'est tout)
 */
# include <stdio.h>
# include <stdlib.h>
# include <unistd.h>
# include <sys/types.h>
# include <sys/wait.h>
# include <assert.h>

enum {
  MaxLigne = 1024,              // longueur max d'une ligne de commandes
  MaxMot = MaxLigne / 2,        // nbre max de mot dans la ligne
  MaxDirs = 100,        // nbre max de repertoire dans PATH
  MaxPathLength = 512,      // longueur max d'un nom de fichier
};

void decouper(char *, char *, char **, int);

# define PROMPT "? "

int
main(int argc, char * argv[]){
  char ligne[MaxLigne];
  char pathname[MaxPathLength];
  char * mot[MaxMot];
  char * dirs[MaxDirs];
  int i, tmp;

  /* Decouper UNE COPIE de PATH en repertoires */
  decouper(strdup(getenv("PATH")), ":", dirs, MaxDirs);

  /* Lire et traiter chaque ligne de commande */
  for(printf(PROMPT); fgets(ligne, sizeof ligne, stdin) != NULL; printf(PROMPT)){
    decouper(ligne, " \t\n", mot, MaxMot);
    if (mot[0] == NULL)            // ligne vide
      continue;

    tmp = fork();               // lancer le processus enfant
    if (tmp < 0){
      perror("fork");
      continue;
    }

    if (tmp != 0){             // parent : attendre la fin de l'enfant
      while(wait(NULL) != tmp)
        ;
      continue;
    }

                // enfant : exec du programme
    for(i = 0; dirs[i] != NULL; i++){
      snprintf(pathname, sizeof pathname, "%s/%s", dirs[i], mot[0]);
      execv(pathname, mot);
    }
                                // aucun exec n'a fonctionne
    fprintf(stderr, "%s: not found\n", mot[0]);
    exit(1);
  }

  printf("Bye\n");
  return 0;

}
  • # Comment dire

    Posté par  (site web personnel) . Évalué à 3.

    Ça nous donnera droit à quel diplôme ?
    Nan, parceque ce sont bien les gens qui fournissent le travail qui décrochent le diplôme, non ?

    • [^] # Re: Comment dire

      Posté par  . Évalué à 2.

      ce sont bien les gens qui fournissent le travail qui décrochent le diplôme, non ?

      Si un diplôme indiquait que du travail a été fourni, ce serait une grande nouvelle. Souviens-toi de certains de tes camarades :-)
      Ce n'est pas une bijection, donc en travaillant on peut avoir un diplôme.

      Dans la même veine :
      - ce sont ceux qui travaillent qui récoltent le salaire
      - ce sont ceux qui sont compétents qui sont aux manettes

      • [^] # Re: Comment dire

        Posté par  (site web personnel) . Évalué à 2.

        Si un diplôme indiquait que du travail a été fourni, ce serait une grande nouvelle.

        Ah ah, c'est pour cela qu'il est possible de faire une école (cotée) qui ne délivre aucun diplôme, boulot quasi assuré en sortie. Je la conseille à tous les Spé…

  • # Aide?

    Posté par  . Évalué à 3.

    Dis-nous ce que tu as essayé de faire, ce que ça donne, ce que tu n'as pas compris.
    Là on pourra peut-être t'aider.

    Si on le fait à ta place on ne t'aide pas.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.