IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Boucle fork pour shell unix


Sujet :

C

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 10
    Points : 11
    Points
    11
    Par défaut Boucle fork pour shell unix
    Bonjour,

    je souhaite actuellement recoder un shell unix (du moins un début de shell, sans les pipe pour l'instant).

    A l'heure actuelle, mon programme me permet de lancer une commande du PATH avec ses options.
    J'aimerais qu'une fois cette commande executée, je puisse en saisir une autre et ainsi de suite, jusqu'à ce que je fasse CTRL C.
    Le soucis c'est que je ne sais absolument pas quoi mettre dans ma boucle, et quelle condition lui passer... J'aimerais qu'en gros mon programme arrête de forker dés un CTRL C mais je sais pas comment implémenter ça ...

    Si vous pouviez me donner des pistes, voici mon main actuel et le résultat obtenu notamment en faisant un read sur une saisie de "ls -a" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     extern char **environ;
      int	rd;
      int	i;
      char	buf[1024];
      char	**cmd;
      char	**param;
      char	*path;
      pid_t	pid;
      int	status;
     
      i = 0;
      while (i < 1025)
        {
          buf[i] = 0;
          i++;
        }
      putchar('>');
      status = 0;
      if ((pid = fork() == -1))
        {
          write(2, "Unable to fork\n", strlen("Unable to fork\n"));
          return (-1);
        }
      if (pid > 0) 
        {
          putchar('>');
          wait(&status);
        }
      else
        {
          rd = read(0, buf, 1024);
          path = concat_path(buf);
          cmd = my_cmd_to_wordtab(buf);
          param = final_arg(buf);
          execve(path, param, environ);
        }
      close(rd);
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     ./a.out 
    ls -a
    .  ..  a.out  concat_path.c  main.c  main.c~  my_cmd_to_wordtab.c  my_str_to_wordtab.c  prep_cmd.c  recup_path.c  recup_path.h  recup_path.h.gch
    Donc voilà, si vous pouviez juste m'aider à raisonner là dessus... me donner des éléments de recherches, des appels système que je peux utiliser, ce serait sympa merci

  2. #2
    Membre expérimenté Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Points : 1 396
    Points
    1 396
    Par défaut
    Salut,

    Tu peux déjà distinguer deux cas:

    * Le cas où tu lances une commande et tu es obligé d'attendre la fin pour en taper une autre. (Comme tu le fais jusqu'à présent).
    * Le cas où tu lances une commande mais tu peux toujours en taper une autre pendant que la première s'exécute (ceci se fait dans un shell normal en mettant le caractère '&' à la fin de la commande).

    Pour le premier cas, si tu attends simplement un ctrl-c, alors tu peux faire un while(1){ ... }. Et voila

    Par contre, un détail qui m'a étonné dans ton code, c'est de faire un write(2, ...) pour écrire sur la sortie d'erreur, utilise fprintf(stderr, "...");, c'est plus beau et tu ne dois pas faire un strlen en plein milieu.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 10
    Points : 11
    Points
    11
    Par défaut
    Merci, je viens de réussir
    Concernant fprintf, je n'y ai pas le droit dans le cadre de mon projet...
    Donc oui, write(2...) c'est moche mais je vois pas trop comment faire autrement :s

  4. #4
    Membre expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Points : 3 352
    Points
    3 352
    Par défaut
    Salut,

    une remarque en dehors du problème : dans le morceau suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ...
      char buf[1024];
      ...
      i = 0;
      while (i < 1025)
        {
          buf[i] = 0;
          i++;
        }
    Tu initialises buf[1024] à 0 ce qui est en dehors de la zone mémoire allouée à buf.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Un plugin pour les scripts shell Unix
    Par Neuromancien2 dans le forum Eclipse
    Réponses: 1
    Dernier message: 22/01/2008, 09h11
  2. Shell Unix pour la Purge de fichiers?
    Par jfmerveille dans le forum C
    Réponses: 2
    Dernier message: 27/02/2007, 02h34
  3. Lancement d'un shell Unix dans un proc stockée
    Par SBA03 dans le forum Oracle
    Réponses: 20
    Dernier message: 31/08/2006, 10h22
  4. CODE RETOUR GENERE PAR PL/SQL POUR SHELL UNIX
    Par mimi_été dans le forum PL/SQL
    Réponses: 6
    Dernier message: 18/11/2004, 09h32
  5. Lancer des shell unix pour creation d'objet ORACLE
    Par sygale dans le forum Administration
    Réponses: 6
    Dernier message: 27/10/2004, 19h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo