Partage
  • Partager sur Facebook
  • Partager sur Twitter

commandes conditionnelles en C (shell)

    14 octobre 2019 à 22:31:01

    Bonjour, je dois implémenter un shell en C, il doit etre capable de pouvoir executer une suite de commande conditionnelle, par exemple touch fichier1 && touch fichier2

    j'ai essayé ce code, il arrive a réaliser la premiere commande mais pas la 2eme, de plus la valeur de r1 et r2 sont egales a 2, ou est le probleme je ne vois vraiment pas ce qui cloche ?

    #include <unistd.h>
    #include <sys/types.h>
    
    
    
    void sequentiallCommand(char *c1[], char *c2[])
    {
            int p1,p2;
            int r1,r2;
            p1  = fork();
    
            if(p1)
            {
              r1 = execvp(c1[0], c1);
    
            }
             if(r1){
            p2 = fork();
            if(p2)
            {
                    r2 = execvp(c2[0], c2);
            }
            }
    
    
    }
    int main(int argc, char *argv[])
    {
     char *c1[] = {"touch","fichier1",NULL};
     char *c2[] = {"touch","fichier2", NULL};
    sequentiallCommand(c1,c2);
    
    }
    
    ~                                                                                                                                                                                                           
    ~                                                                                                                                                                                                           
    ~                                                                                                                                                                                                           
    ~                                                                                                                                                                                                           
    ~                                                                                                                                                                                                           
    ~                                                                                                                                                                                                           
    ~                                                                                                                                                                                                           
    ~                                                                                                                                                                                                           
    ~                                     



    • Partager sur Facebook
    • Partager sur Twitter
      14 octobre 2019 à 22:35:50

      Pourquoi il marcherait ?

      Tu sais ce que retourne execvp ?

      Ps merci d'indenter le code correctement la prochaine fois.

      -
      Edité par michelbillaud 14 octobre 2019 à 22:37:33

      • Partager sur Facebook
      • Partager sur Twitter
        14 octobre 2019 à 22:40:27

        michelbillaud a écrit:

        Pourquoi il marcherait ?

        Tu sais ce que retourne execvp ?

        Ps merci d'indenter le code correctement la prochaine fois.

        -
        Edité par michelbillaud il y a moins de 30s

        -1 en cas d'erreur ?

        • Partager sur Facebook
        • Partager sur Twitter
          14 octobre 2019 à 23:27:13

          Une erreur de execvp, c'est quand le lancement de la commande n'a pas été fait.

          Ne pas confondre avec le code de retour.

          Ensuite, il y a dédoublement par le premier fork. Un processus affecte sa variable r1, et l'autre s'en tamponne le lardon.

          ---

          Ce qu'il faut faire

          • faire exécuter la première commande
          • regarder comment elle s'est terminée
          • en fonction de ça, lancer ou pas la seconde commande.

          Pour le premier point, il y a un execvp à faire par le processus fils lancé par le fork.

          Ensuite, il faut attendre que ce processus se termine pour pouvoir connaître son code de retour (avec un wait quelque chose).

          Accessoirement, si le lancement s'est loupé, on fait comme si il y avait un code de retour 127.

          $ qsdqsdq
          bash: qsdqsdq : commande introuvable
          $ echo $?
          127
          


          --

          je suggère donc que tu fasses une fonction auxiliaire qui essaie de lancer une commande, et retourne son code de retour. ça encapsulera le fork et le exevp

          Utilisation

          int sequentialCommand(char *command1[], char *command2[]) 
          {
              int status1 = runCommand(command1);
              return status1 == 0 
                         ? runCommand(command2)
                         : status1;
          }
          



          -
          Edité par michelbillaud 15 octobre 2019 à 11:44:26

          • Partager sur Facebook
          • Partager sur Twitter

          commandes conditionnelles en C (shell)

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown