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 :

Aide avec les fork()


Sujet :

C

  1. #21
    Membre expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Points : 3 532
    Points
    3 532
    Par défaut
    omg omg...
    J'avais aussi zappé le fgets....

    Vérifie si dans les caractères que tu as lu, tu as bien de l'alphanumérique....

    man ascii avec des if/then/else pour recopier tout sauf les caractères que tu ne veux pas...

    EDIT : le '\n' final doit trainer, du coup le strcmp de ls renvoi un "non" ou des trucs dans ce genre là...
    Pas besoin de rediriger les flux, par défaut le fils écrira aussi dans le même STDOUT que le père (héritage des fd ouverts)
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  2. #22
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 152
    Points : 64
    Points
    64
    Par défaut
    Comment je fais pour vérifier ça ?

  3. #23
    Membre émérite
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 852
    Points : 2 298
    Points
    2 298
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char **mots = malloc(i + 1);
    Et voici le meilleur moyen au monde de segfaulter ! La macro sizeof existe bien pour une bonne raison !

  4. #24
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 152
    Points : 64
    Points
    64
    Par défaut
    Il faudrait mettre sizeof(char)*(i+1) tu veux dire ?

  5. #25
    Membre émérite
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 852
    Points : 2 298
    Points
    2 298
    Par défaut
    Il faudrait mettre sizeof(char)*(i+1) tu veux dire ?
    Non plus ! Petite leçon sur la taille des variables et pourquoi il faut toujours utiliser sizeof dans un malloc :

    char -> 1 octet
    char* -> 4 octets (sur 32 bits) / 8 octets (sur 64 bits)

    Conclusion, quand tu fais un malloc et que tu alloues 3 octets (par exemple) à ton tableau de pointeur, tu n'as même pas la place pour en avoir un seul en fait ! Ce serait équivalent a un char[3] (je grossis les bords).

    Pour éviter ce problème, on fait toujours (tout du moins du moins on devrait !) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void *ptr = malloc(sizeof(*ptr) * (taille_tableau));

  6. #26
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 152
    Points : 64
    Points
    64
    Par défaut
    Ok merci ^^

  7. #27
    Membre expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Points : 3 532
    Points
    3 532
    Par défaut
    Essaye déjà tout ça, puis si ça ne marche toujours pas, vérifies les arguments que tu envoies.

    Le bon vieux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if ((str[i] < ' ') || (str[i] > '~'))
      /* caractère pas affichable */
    else
      /* caractère affichable */
    Te permettra de recopier ce qu'il faut ! (et un grand "(!(if...))" pour inverser la condition évidemment)
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  8. #28
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 152
    Points : 64
    Points
    64
    Par défaut
    Je ne comprend pas, cela me permettra-t-il de vérifierr la validité d'un mot avant de le mettre dans mon tableau ?

  9. #29
    Membre expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Points : 3 532
    Points
    3 532
    Par défaut
    Non... vas lire la table ASCII...
    Ca te permet de savoir si c'est un caractère affichable ou non...
    Du coup tu vas recoder un strdup qui va copier le caractère SI et SEULEMENT SI il est affichable... et tu vas le placer dans ton code pour copier les arguments correctement
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  10. #30
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 152
    Points : 64
    Points
    64
    Par défaut
    Désolé je n'y arrive pas ><

    J'avais trouvé une fonction pour remplacer un char (pour remplacer le "\n" par un "\0"), mais ça me fait un segmentation fault :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void chng(char *buff, char old, char new)
    {
     char *ptr;
     for(;;)
     {
      ptr = strchr(buff, old);
      if(ptr==NULL) break; 
         buff[(int)(ptr-buff)]=new;
     }
     
    }

  11. #31
    Membre expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Points : 3 532
    Points
    3 532
    Par défaut
    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
     
    char *my_strdup_alphanum(char *str)
    {
      int max, j, i = 0;
      char *tmp = NULL;
     
      if (str == NULL)
        return (NULL);
     
      max = 0;
      while (str[i] != '\0')
      {
         if ((str[i] => ' ') && (str[i] <= '~'))
            max++;
         i++;
      }
     
      if (max == 0)
        return (NULL);
     
      tmp = malloc((max + 1) * sizeof (char));
      i = 0;
      j = 0;
      while (str[i] != '\0')
      {
         if ((str[i] => ' ') && (str[i] <= '~'))
         {
            tmp[j] = str[i];
            j++;
         }
         i++;
      }
      tmp[max] = '\0';
      return (tmp);
    }
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  12. #32
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 152
    Points : 64
    Points
    64
    Par défaut
    Whow, ça marche impecc !

    Je vais reprendre mes cours et faire des td plus simples sur les chars avant de continuer je crois bien !

    Merci metalman (et tous les autres).

  13. #33
    Membre expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Points : 3 532
    Points
    3 532
    Par défaut
    Le plus intéressant c'est en effet la partie avec les interfaces système, vu que cela réagi "vraiment" avec les périphériques
    Mais pour travailler avec il faut bien comprendre les typages, pointeurs.... et le fonctionnement des chaînes de caractère.

    Enfin t'inquiète pas trop... comme "exercices" je peux te conseiller de recoder la plupart des fonctions de la libC (toutes les str* les strn*... atoi, itoa...), les tester avec tout ce que tu peux, et passer un coup de valgrind dessus pour vérifier qu'il n'y a aucun problème de mémoire.

    Ensuite, tu pourras faire le fou avec toute la partie système et réseau !
    (et l'excellent livre avec des exemples qui marchent : "Linux : Programmation Système et Réseau")
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  14. #34
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 152
    Points : 64
    Points
    64
    Par défaut
    Merci pour la référence ^^ Ca va bien m'aider pour mon cours de système et réseau.

    Sinon j'avais une petite question, là j'essaye de donner le temps d'exécution d'une commande. Je place donc un premier clock() pour récupérer l'heure au départ, et un second à la fin pour l'arrivée, puis je fais la différence des deux.
    J'ai toujours un temps de 0 donc il y a un problème quelque part. Comment je dois plcer mes clock() ? Pas dans le fils j'imagine ?
    J'ai mis le 1er avant le parsing et le second dans ma boucle avec le wait().

  15. #35
    Membre expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Points : 3 532
    Points
    3 532
    Par défaut
    Dans un vieux minishell à moi que j'ai retrouvé...
    Il y a ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
      is_fils = fork();
      if (is_fils == 0)
      {
        ret = the_exec(tab); /* appel a execvp */
        if (ret != 0)
          exit(127);
      }
      else
      {
        fils = wait(&status);
        ret = WEXITSTATUS(status);
      }
    Tu dois mettre ton clock après le wait(); et avant le fork(); !
    Hmmm... mais si ta différence reste à 0.... quel type utilises-tu pour ta clock ?

    EDIT : et n'oublies pas :
    "La valeur renvoyée est le temps CPU écoulé, en unités d'horloge clock_t, pour obtenir une durée en secondes, divisez-la par CLOCKS_PER_SEC. "
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  16. #36
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 152
    Points : 64
    Points
    64
    Par défaut
    D'accord, alors j'ai fais :

    Je les ai placé comme tu me l'a dis, mais j'ai toujours 0, ça vient peut-être du type de la différence ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    wait();
          t2 = clock();
          temps = (float)(t2-t1)/CLOCKS_PER_SEC;
          printf("\n Temps d'exécution : %f\n",temps);

  17. #37
    Membre expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Points : 3 532
    Points
    3 532
    Par défaut
    Hmmm...

    Essaye :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      t2 = (t2 - t1) / CLOCKS_PER_SEC;
      printf("\n Temps d'exécution : %f\n", (long) t2);
    De ce que je vois, le type "clock_t" n'est pas très très défini...
    D'autre sont conseillé ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      t2 = (double) (t2 - t1) / (double) CLOCKS_PER_SEC;
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  18. #38
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 152
    Points : 64
    Points
    64
    Par défaut
    Toujours pareil, sauf qu'avec long j'ai qu'un 0 alors qu'avant c'était 0.00000.

    Je vais essayé de trouver une autre fonction que clock peut-être.

  19. #39
    Membre expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Points : 3 532
    Points
    3 532
    Par défaut
    gettimeofday !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    long                  res;
    struct timeval        tv;
     
    gettimeofday(&tv, NULL);
    res = tv.tv_sec;
    printf("long : %ld\n", res);
    Ce que je peux ajouter : si tu veux construire un char* avec, il te faudra un itoa qui gère les long....
    Personnellement j'ai du le recoder avec le flag ansi...
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  20. #40
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 152
    Points : 64
    Points
    64
    Par défaut
    C'est quoi comme format ça ?
    J'ai des chiffres du genre 1364733626 à l'exécution de ce morceau de code.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 3 PremièrePremière 123 DernièreDernière

Discussions similaires

  1. besoin d'aide avec les session
    Par alain57 dans le forum Langage
    Réponses: 4
    Dernier message: 29/06/2006, 20h25
  2. Besoin d'aide avec les regxp
    Par vodevil dans le forum Langage
    Réponses: 1
    Dernier message: 04/04/2006, 12h28
  3. Besoin d'aide avec les fichier htaccess et htpasswd
    Par Polux000 dans le forum Apache
    Réponses: 2
    Dernier message: 26/01/2006, 00h05
  4. [vb excel]Aide avec les tableaux
    Par Mugette dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 27/09/2005, 12h07
  5. Réponses: 2
    Dernier message: 29/08/2003, 17h52

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