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

Linux Discussion :

fork() exec et cie..


Sujet :

Linux

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Inscrit en
    Décembre 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 5
    Par défaut fork() exec et cie..
    Bonjour,

    Etant debutant dans la programation systeme, j'essaie de resoudre un exercice sur les processus.


    Le but de l'exercice est de faire un programme en ligne de commande prenant pour argument une chaine de la forme : " COMMANDE ARGUMENTS &> FICHIER" qui execute COMMANDE ARGUMENT en dirigeant stdin et stderr vers FICHIER.

    exemple:
    touch dummy
    chmod 200 dummy
    ./programme "cat *.c &> file.out"

    qui devrait envoyer dans file.out tous les fichiers avec extension ".c" et un message d'erreur pour le fichier dummy.

    Je dois utiliser les fonctions fork, une version d'exec, strtok, et dup/dup2. (2 versions demandées une avec dup une avec dup2)

    J'ai codé la version suivante, mais j'ai un souci lorsque j'appelle une commande utilisant un argumant de la forme *.extension comme dans l'exemple ci dessus, pour le reste je pense que ca marche. Le probleme est que je ne vois pas du tout ou est le probleme. Auriez vous une idée ?


    Voici ce que j'obtiens avec mon programme:

    $ ./programme "cat *.c &> file.out"
    $ cat file.out
    cat: *.c: Aucun fichier ou dossier de ce type


    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    #include <stdlib.h>
    #include <stdio.h>
    #include <unistd.h>
    #include <errno.h>
    #include <sys/wait.h>
    #include <string.h>
    #include <fcntl.h>
     
     
    void usage()
    {
      fprintf(stderr,"Usage: execute \"command argument &> file\"\n");
      exit(1);
    }
    int main(int argc, char * argv[])
    {
      char *command,*currStr;
      char * fileName;
      int fd,i;
      char ** arg=NULL;
      pid_t exc=0;
     
      if (argc!=2) usage();
     
      command = strtok(argv[1],"&>");
      fileName = strtok(NULL,"&> ");
     
     
      currStr = strtok(command," ");
      i=1;
      do{
     
        arg=(char**) realloc(arg,i * sizeof(char*));
        arg[i-1]=currStr;
        i++;
        currStr=strtok(NULL," ");
      } while(currStr!=NULL);
     
      arg=(char**) realloc(arg,i * sizeof(char*));
      arg[i-1]=NULL;
     
      exc=fork();
     
      if (exc==-1)
      {
        fprintf(stderr,"error in fork()");
        exit(1);
      }
     
      if (exc==0)
      {
        fd=open(fileName,O_WRONLY | O_CREAT | O_APPEND,0644);
     
        if (fd < 0)
        {
          perror("open");
          exit(1);
        }
        close (STDOUT_FILENO);
        close (STDERR_FILENO);
        if (dup(fd)<0 || dup(fd)<0) {
          perror ("dup");
          exit(1);
        }
        close(fd);
     
        execvp(arg[0],arg);
        printf("brr");
      }
     
      wait(NULL);
    }

  2. #2
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Bonjour,

    Quelques remarques en vrac sur ton programme :
    C'est dommage de devoir utiliser strtok et pas sscanf ; strtok a pour probleme de modifier son argument, et est complexe a bien utiliser. Pour info, tu as un bon tuto dessus ici. Mais passons.
    Pourquoi realloc alors que tu n'as pas encore fait d'allocation ?
    Tu ne testes pas le code de retour de realloc, ce qui conduit a un crash en cas de refus d'allocation.
    Tu n'utilises pas bien realloc, puisqu'en cas de probleme d'allocation, tu perds l'espace memoire deja alloue (fuite memoire). Tu me diras que ce n'est pas grave puisque tu crash dans ce cas....
    Tu ne liberes pas la memoire allouee. man free.

    Et enfin, je ne suis pas certain que ton algorithme soit vraiment ce qui se fait de plus simple pour le probleme que tu as. Je te conseille de le revoir, puis ensuite seulement de passer a l'implementation.
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 833
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 833
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par gangsoleil Voir le message
    Pourquoi realloc alors que tu n'as pas encore fait d'allocation ?
    Il me semble (enfin ça fait longtemps que je fais plus de C donc je peux me tromper) que realloc, si on lui passe un pointeur NULL en premier argument, se comporte comme malloc. Ce qui évite ainsi de devoir faire le test "suis-je en première allocation ou en réallocation" lors des boucles de remplissage...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Membre chevronné Avatar de Jenna
    Inscrit en
    Décembre 2009
    Messages
    272
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Décembre 2009
    Messages : 272
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Il me semble (enfin ça fait longtemps que je fais plus de C donc je peux me tromper) que realloc, si on lui passe un pointeur NULL en premier argument, se comporte comme malloc. Ce qui évite ainsi de devoir faire le test "suis-je en première allocation ou en réallocation" lors des boucles de remplissage...
    Oui, tout à fait

  5. #5
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Bonjour,

    Citation Envoyé par Sve@r Voir le message
    Il me semble (enfin ça fait longtemps que je fais plus de C donc je peux me tromper) que realloc, si on lui passe un pointeur NULL en premier argument, se comporte comme malloc. Ce qui évite ainsi de devoir faire le test "suis-je en première allocation ou en réallocation" lors des boucles de remplissage...
    C'est tout a fait le cas. Mais je trouve que ca nuit a la lisibilite du programme, et que ce n'est pas si complique de commencer par faire une allocation a la bonne taille, puis de ne la redimensionner que si cela s'avere necessaire par la suite, plutot que la boucle d'allocation que propose lylo01.
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

Discussions similaires

  1. cleaning process fils avec waitpid() fork exec pselect
    Par thorgal99 dans le forum Réseau
    Réponses: 2
    Dernier message: 19/08/2014, 11h59
  2. fork + exec + mémoire partagée ?
    Par italiasky dans le forum POSIX
    Réponses: 2
    Dernier message: 26/08/2009, 16h18
  3. Débutant sur les fork() et exec()
    Par Sin-an dans le forum Linux
    Réponses: 7
    Dernier message: 20/04/2009, 18h56
  4. Fork, pipe, exec
    Par shepounet dans le forum Linux
    Réponses: 2
    Dernier message: 21/03/2009, 14h08
  5. Exercice en c sur les forks+Pipe+exec
    Par Elendhil dans le forum Linux
    Réponses: 6
    Dernier message: 07/11/2007, 19h32

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