[C]Traduire un code shell en C

Ikedia -  
crabs Messages postés 909 Statut Membre -
Bonjour,

j'aurais besoin d'aide pour traduire ce code shell en utilisant le langage C

exe1 <file -O | exo4 -lix >>results


Merci d'avance

10 réponses

  1. Ikedia
     
    Est-ce que quelqu'un aurait une idée sur la manière de procéder?
    0
  2. arth Messages postés 84 Date d'inscription   Statut Contributeur Dernière intervention   1 296
     
    Est ce que tu peux me dire à quoi correspnd cette commande?
    0
  3. Ikedia
     
    Bonjour,

    je suppose que ce code ne correspond à rien

    On me demande juste de retranscrire ce code shell en utilisant le C, c'est à écrire sur feuille, donc ne doit pas être compilé

    Je ne sais pas comment m'y prendre.

    As-tu une idée?
    0
  4. crabs Messages postés 909 Statut Membre 507
     
    Salut,
    Si tu dois donner un source pour UNIX/LINUX, regardes du coté des
    fonctions système :
    fork() : création d'un processus
    execlp() : remplacement d'un processus par un autre
    open(), read(), write(), close() : primitives de manipulations des fichiers
    pipe() : création d'un tube de communication
    dup2() : duplication d'un descripteur de fichier ouvert avec un numéro de
    descripteur de fichier de ton choix.
    Il faut avoir à l'esprit que les descripteurs de fichiers suivant ont des
    rôles précis :
    0 : entrée standard du processus (saisie au clavier)
    1: sortie standard
    2 : sortie d'erreur

    A+, crabs
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Ikedia
     
    exe1 <file -O | exo4 -lix >>results

    Voici ce que j'ai fait .
    Si quelqu'un pouvait me dire ce qui ne va pas .

    Merci d'avance .

    Voici le code :

    int main (void){
    }
    0
  7. jamel_theone Messages postés 61 Statut Membre 20
     
    Bein la tu as seulement definie la fonction qui sera le point d'entree de ton programme, mais ca ne fera rien du tout...Je sais pas si c'est exactement ce que tu veux, mais en C, tu peux utiliser la fonction System pour executer la commande telle quelle (vu qu'apparemment c'est une commande aleatoire)
    0
  8. Ikedia
     
    Désolé, j'avais validé alors que je n'vais pas tout tapé

    Voici ce que j'ai fait .
    Si quelqu'un pouvait me dire ce qui ne va pas .

    Merci d'avance .

    Voici le code :

    int main (void){
    int p[2];
    pid_t pid;
    int fd,fd2;
    char tampon[BUFSIZ];
    int nb_lus;

    if(pipe(p)==-1){
    perror("pipe");
    exit(1);
    }

    if(pid=fork()==-1){
    perror("fork");
    exit(1);
    }

    if(pid){
    close(p[0]);

    fd = open("fichier",O_CREAT);
    int nb_lus = read(fd,tampon,BUFSIZ);
    if(nb_lus == -1){
    perror("read");
    exit(1);
    }
    close(fd);

    fd2 = open("exe1",O_CREAT|O_TRUNC);
    write(fd2,tampon,nb_lus);
    }

    close(p[1]);
    dup2(p[0],0);
    execlp("exo4","exo4", "-lix");
    }
    0
  9. crabs Messages postés 909 Statut Membre 507
     
    Salut,
    La commande shell à écrire en C est :
    exe1 <file -O | exo4 -lix >>results 

    Ton processus doit éxécuter ces traitements :
    ETAPE 1 : le pipe entre les deux processus
        - création d'un pipe mémoire : int p[2] ; pipe( p )
    ETAPE 2 : le processus exe1
        - creation d'un nouveau processus : la suite c'est le code  du fils : fork()
        - ouvrir en lecture seule le fichier "file" : fdfile = open("file", O_RDONLY)
        - fermer l'entrée standard en la duplicant avec fdfile : dup2()
        - fermer la sortie standard en la duplicant avec p[1]
        - fermer p[0]
        - remplacer le fils par "exe1 -O" : execlp()
    ETAPE 3 : le processus exo4 (c'est le processus père du for
        - creation d'un nouveau processus : la suite c'est le code  du fils : fork
        - ouverture de results en mode ajout :
              fdresults = open( "results", O_WRONLY|O_CREAT|O_APPEND, 0666);
        - fermer la sortie standard en la duplicant avec fdresults
        - fermer l'entrée standard en la duplicant avec p[0]
        - fermer p[1]
        - remplacer le process par "exo4 -lix"
    ETAPE 4 :
        - fermer p[0] et p[1]
        - attendre la mort des fils : 2 fois wait()
        - exit du status le plus défavorable
    

    Lorsque tu utiliser execlp, ne pas oublier de mettre le dernier argument
    à NULL et de traiter l'erreur, exemple pour exe1
    execlp( "exe1", "exe1", "-O", NULL ) ;
    perror( "execlp" ) ; /* le execlp c'est mal passé */
    exit( 100 )  ;
    

    A+, crabs
    0
  10. Ikedia
     
    Bonjour,

    Est-ce que maitenant le programme est bien écrit ?

    int main (void){
      int p[2];
      int fdfile,fdresults;
      int status;
      
      if(pipe(p)==-1){
        perror("pipe");
        exit(1);
      }
      
      switch(fork()){
      case -1 :
        perror("fork");
        exit(2);
        
      case 0:
        fdfile = open("file", O_RDONLY);
        dup2(fdfile, 0);
        dup2(p[1], 1);
        close(p[0]);
        execlp("exe1", "exe1", "-O", NULL) ;
        perror("execlp" );
        exit(3);
        
      default:
        fdresults = open("results", O_WRONLY|O_CREAT|O_APPEND, 0666);
        dup2(fdresults, 1);
        dup2(p[0], 0);
        close(p[1]);
        execlp("exo4", "exo4", "-lix", NULL) ;
        perror("execlp" );
        exit(4);
      }
      close(p[0]);
      close(p[1]);
    }
    0
  11. crabs Messages postés 909 Statut Membre 507
     
    Salut,
    Tu y es presque...
    Il manque un fork() -> dans le 'default' il faut créer un autre processus
    pour exo4
    Il manque wait() ou waitpid() pour que le père ne meurre pas avant les fils
    et que ton système se retrouve avec des processus zombies.
    Ton code ne permet d'atteindre les close() hors du switch, car le default fait
    un exec.
    En programmation système, il est de bon ton de tester tous les codes de
    retour des primitives et d'assumer une gestion d'erreur initialement
    simplissime : perror() + exit().
    A+, crabs
    0