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 :

Problème gestion des processus


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 165
    Points : 56
    Points
    56
    Par défaut Problème gestion des processus
    Je vous explique mon but est de creer un minishell en langage C. Je doit pour cela me servir des binaire existant dans /bin ainsi que de quelque builtins a faire , notament setenv et cd.
    J' ai realiser tous ces builtins , je galere dans la fonction main, je ne sais pas comment gerer les different processus
    avec le main ci dessou, je peu executer mes commande , cependant qd je fait setenv puis ensuit env, rien a change. Ma fonction setenv fonctionne pourtant. Pareil pour cd je fait cd, puis ls et je me rend compte que rien a changer, et enfin g une fonction exit qui affiche un message puis fait exit(1) le message apparait mais je ne quitte pas mon prg....
    Quelqu'un peu m aider...
    En esperant avoir ete assez comprehensible

    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
    int	main(void)
    {
      int	nb_read;
      char	buffer[BUFF_SIZE];
      int	pid;
      int	statut;
      char	**tab;
     
      tab = my_recup_path();
      my_putstr("$> ");
      while ((nb_read = read(0, buffer, BUFF_SIZE)))
        {
          buffer[nb_read - 1] = '\0';
          pid = fork();
          if (pid)
    	{
    	  wait(&statut);
    	  my_putstr("$> ");
    	}
          else
    	{
    	  execute_command(tab, buffer);
    	  exit(1);
    	}
        }
        free(buffer);
        free(tab);
      return (0);
    }

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Bonjour
    J'ai peur que vous ne donniez pas suffisament d'informations sur le reste de votre programme pour conclure quoi que ce soit.

    Ceci dit, écrire un shell n'est pas une si mince affaire!
    Je vous suggère de jetez un oeil à sic - so it is - .
    Il implémente un mini-shell pour illustrer l'utilisation des outils GNU, et vous pouvez en récupérer les sources à autobook download
    C'est suffisament petit pour que vous en tiriez profit.
    Cordialement,
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre régulier
    Inscrit en
    Mars 2006
    Messages
    117
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mars 2006
    Messages : 117
    Points : 109
    Points
    109
    Par défaut
    pour tracer le deroulement de tes appels fonctions je t'invite à utiliser GDB qui est un debugger C tres puissant qui te permettra de voir ce qui se passe à tout moment dans tes fonctions pour le faire fonctionner :
    42sh:> gcc -g <autres_flags> <sources.c> -o debug
    42sh:> gdb debug
    ensuite tu peux voir les commandes possibles en tapant help
    les plus utils sont stack-trace (pas sur de la syntaxe) : qui t'affiche la pile d'appel.
    breakpoint fichier.c:ligne : qui va ajouter un breakpoint dans le fichier specifié à la ligne spécifié (le programme va s'arreter sur cette ligne et tu pourra derouler ligne par ligne ta fonction, voir le contenu des variables en temps reel etc)
    next : passe à la ligne suivante sans rentrer dans les fonctions appelées.
    step : passe à la ligne suivante en rentrant dans les fonctions appelées
    continue : continue l'execution normalement jusqu'au prochain breakpoint ou la fin du prog
    print <variable> : affiche la variable.

    voila pour les commandes de bases. Avec ca tu devrai voir pourquoi tes fonctions/binaires sont pas ou mal appelées.

    si tu utilises emacs tu peux utiliser directement gdb dedans (plus lisible) pour cela tu compiles ton binaire avec ou sans emacs (avec emacs M-x compile, puis tu fais make si tu es la ou se trouve ton makefile) puis fait M-x gdb et normalement il trouve ton binaire tout seul, sinon il suffit d'aller le chercher.

    Bon courage

  4. #4
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par toams69 Voir le message
    Je vous explique mon but est de creer un minishell en langage C. Je doit pour cela me servir des binaire existant dans /bin ainsi que de quelque builtins a faire , notament setenv et cd.
    J' ai realiser tous ces builtins , je galere dans la fonction main, je ne sais pas comment gerer les different processus
    avec le main ci dessou, je peu executer mes commande , cependant qd je fait setenv puis ensuit env, rien a change. Ma fonction setenv fonctionne pourtant. Pareil pour cd je fait cd, puis ls et je me rend compte que rien a changer, et enfin g une fonction exit qui affiche un message puis fait exit(1) le message apparait mais je ne quitte pas mon prg....
    Quelqu'un peu m aider...
    En esperant avoir ete assez comprehensible

    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
    int	main(void)
    {
      int	nb_read;
      char	buffer[BUFF_SIZE];
      int	pid;
      int	statut;
      char	**tab;
     
      tab = my_recup_path();
      my_putstr("$> ");
      while ((nb_read = read(0, buffer, BUFF_SIZE)))
        {
          buffer[nb_read - 1] = '\0';
          pid = fork();
          if (pid)
    	{
    	  wait(&statut);
    	  my_putstr("$> ");
    	}
          else
    	{
    	  execute_command(tab, buffer);
    	  exit(1);
    	}
        }
        free(buffer);
        free(tab);
      return (0);
    }

    Bonjour,

    c'est un grand classique !

    Dans un shell "normal" (qui marche correctement), lorsque tu tapes une commande comme "ls", le shell forke et le fils exécute la commande avant de rendre la main au shell.

    Si tu exécutes un shell script toto.csh dont le contenu est juste "cd .." ou "setenv TOTO 3", même avec un shell normal, tu t'apercevras que tu n'as pas changé de directory ou que TOTO n'est pas modifiée !

    Et c'est normal ! Parce que, lors du fork, l'environnement du process (l'interprète shell) est dupliqué et recopié dans le fils qui vit sa vie de manière indépendante en oubliant complètement le père.

    En revanche, si tu fais "source toto.csh", tu t'apercevras que l'interprète shell n'a PAS forké, mais que toto.csh a été exécuté DANS l'environnement de l'interprète.

    De même, si un script contient "exit", suivant que tu l'exécutes ou que tu le sources, le résultat est très différent!

    En fait, tous les interprètes shell ont une gestion particulière de certaines instructions dites "natives" pour lesquelles il ne forke pas. Il s'agit d'instructions comme source, setenv, cd, rehash (je n'en connais pas d'autres).

    En conclusion, il faut que ton interprète fasse réellement un cas particulier de ces instructions, qu'il les reconnaisse et qu'il ne forke pas, mais qu'il les interprète dans son propre environnement.

    Est-ce clair?

    )jack(
    PS: pour un ksh ou sh, il faut remplacer "source toto.csh" par ". toto.sh" et "setenv TOTO 3" par "export TOTO=3"

  5. #5
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par jack-ft Voir le message
    En fait, tous les interprètes shell ont une gestion particulière de certaines instructions dites "natives" pour lesquelles il ne forke pas. Il s'agit d'instructions comme source, setenv, cd, rehash (je n'en connais pas d'autres).
    La liste des commandes natives (builtin) du bash est ici:
    http://www.gnu.org/software/bash/man...#Builtin-Index

    HTH

    )jack(

Discussions similaires

  1. [DB400][Débutant]comprendre la gestion des processus actif
    Par horalass dans le forum Autres SGBD
    Réponses: 8
    Dernier message: 12/12/2006, 09h26
  2. [Système] gestion des processus linux
    Par julien.63 dans le forum Langage
    Réponses: 6
    Dernier message: 17/11/2006, 23h16
  3. gestion des processus
    Par solawe dans le forum Windows
    Réponses: 2
    Dernier message: 17/11/2006, 12h04
  4. Problème - Gestion des exceptions - MFC.
    Par Atomikx dans le forum MFC
    Réponses: 4
    Dernier message: 14/11/2005, 09h38
  5. Réponses: 2
    Dernier message: 21/01/2005, 12h55

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