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

Shell et commandes GNU Discussion :

Lancer des processus en arrière plan


Sujet :

Shell et commandes GNU

  1. #1
    Membre du Club
    Inscrit en
    Août 2006
    Messages
    171
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 171
    Points : 52
    Points
    52
    Par défaut Lancer des processus en arrière plan
    Bonsoir,
    Je veux modifier le shell simple si desous pour permettre de lancer
    des processus en arrière plan, comme dans les shells ordinaires,
    en terminant la commande avec un "&". Exemples :
    ? sleep 1000 &
    ? sleep 1000&
    Code c : 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
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
     
    # include <stdio.h>
    # include <unistd.h>
    # include <string.h>
    # include <stdlib.h>
    # include <sys/types.h>
    # include <sys/wait.h>
     
    enum {
      MaxLigne = 1024,		// longueur max d'une ligne de commandes
      MaxMot = MaxLigne / 2,	// nbre max de mot dans la ligne
    };
     
    # define PROMPT "? "
     
    /* decouper  --  decouper une chaine en mots */
    static void decouper(char ligne[], char separ[], char * mot[], int maxmot) {
      int i, j;
     
      if (mot[0] == 0)
        return;
     
      for(mot[0] = strtok(ligne, separ), i = 1; mot[i - 1] != 0 && i < maxmot - 1; i++)
        mot[i] = strtok(NULL, separ);
      mot[i] = 0;
     
    # ifdef DEBUG
      printf("liste des mots :\n");
      for(j = 0; j < i; j++)
        printf("\t'%s'\n", mot[j]);
      printf("fin de la liste des mots\n");
    # endif
    }
     
    int main(int argc, char * argv[]) { 
      char ligne[MaxLigne];
      char *mot[MaxMot];
      int tmp;
     
      /* Lire et traiter chaque ligne de commande */
      for(printf(PROMPT); fgets(ligne, sizeof ligne, stdin) != 0; printf(PROMPT)){
        decouper(ligne, " \t\n", mot, MaxMot);
        if (mot[0] == 0)		// ligne vide
          continue;
     
        // Commande spéciale qui doit être exécutée par le parent
        if (strcmp(mot[0], "cd") == 0){
          if (mot[1] == 0)
    	mot[1] = getenv("HOME");
          else if (mot[2] != 0){
    	fprintf(stderr, "usage: cd [dir]\n");
    	continue;
          }
          if (chdir(mot[1]) < 0)
    	perror("cd");
          continue;
        }
     
        tmp = fork();		// lancer le processus enfait
        if (tmp < 0){
          perror("fork");
          continue;
        }
     
        if (tmp != 0){	       // parent : attendre la fin de l'enfant
          while(wait(0) != tmp)
    	;
          continue;
        }
     
        execvp(mot[0], mot);	// enfant : exécuter la commande
    				// si on arrive ici, c'est qu'il y a une erreur
     
        perror(mot[0]);
        exit(1);
      }
     
      printf("Bye\n");
      return 0;
    }
    error(mot[0]);
        exit(1);
      }
     
      printf("Bye\n");
      return 0;
    }

    Merci.

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 916
    Points
    17 916
    Billets dans le blog
    2
    Par défaut
    d'abord c'est du C et pas du shell.

    Ensuite où veux-tu mettre ça ? Je ne vois rien dans ce code qui suggèrerait un endroit.

    Enfin si c'est en C c'est pas compliqué :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    i = system("commande + paramètres &");
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  3. #3
    Membre du Club
    Inscrit en
    Août 2006
    Messages
    171
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 171
    Points : 52
    Points
    52
    Par défaut

    Ensuite où veux-tu mettre ça ? Je ne vois rien dans ce code qui suggèrerait un endroit.
    En fait quand jéxecute le programme il me retourne un "?" comme prompt et là je veut de façon que quand je tape
    ? emacs & alors il me lance un emacs en me rendant la main (?)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    i = system("commande + paramètres &");
    je ne sais pas quoi mettre comme argument pour system et dans quel endroi du code l'inserer.
    Merci.

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 916
    Points
    17 916
    Billets dans le blog
    2
    Par défaut
    quel est le programme que tu veux lancer en arrière-plan ?
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  5. #5
    Membre du Club
    Inscrit en
    Août 2006
    Messages
    171
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 171
    Points : 52
    Points
    52
    Par défaut
    Par exemple emacs & .
    Merci.

  6. #6
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 916
    Points
    17 916
    Billets dans le blog
    2
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  7. #7
    Membre du Club
    Inscrit en
    Août 2006
    Messages
    171
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 171
    Points : 52
    Points
    52
    Par défaut
    Citation Envoyé par souviron34
    je l'ulitilise à quel endroi dans le code ?

    merci.

  8. #8
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 916
    Points
    17 916
    Billets dans le blog
    2
    Par défaut
    ben à l'endroit où tu veux...

    Comme on ne sait pas ce que tu veux faire, c'est tout ce que je peux dire..
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  9. #9
    Membre du Club
    Inscrit en
    Août 2006
    Messages
    171
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 171
    Points : 52
    Points
    52
    Par défaut
    Est_ce que t'as essayé d'éxecuter mon programme (juste pour comprendre ce qu'il fait) ?

    moi je l'éxecute avec l'option $gcc -Wall shell.c -o shell
    il m'affiche:
    ?
    comme prompt ; ok; mais par contre je ne peut pas lancer emacs en arrière plan , je sais pas si c'est clair !

    et en ajoutant system("emacs&");
    il m'affiche des erreurs.

  10. #10
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 916
    Points
    17 916
    Billets dans le blog
    2
    Par défaut
    bon je viens de compiler sous Linux...

    1) bourré d'erreurs...

    compile avec -pedantic ...

    2) je vois ce que tu veux faire, et c'est pas comme ça qu'il faut s'y prendre...

    Mets voir un #define DEBUG et tu verras ta liste de mots n'est pas correcte, déjà au départ.

    Ensuite c'est du C, ce serait mieux sous le forum C.

    Enfin, voici un petit exemple :

    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
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
     
    #include <stdlib.h>
    #include <stdio.h>
     
    #define MAX_COMMAND 500
    #define SUCCESS  1
    #define ERROR      0
     
    char *Cherche_Separateur ( char *Chaine, char *Liste )
    {
      int i = 0, l ;
      char *p = NULL ;
     
        if ( Chaine == NULL )
          return NULL ;
        if ( Liste == NULL )
          return Chaine ;
     
        l = strlen(Liste) ;
        for ( i = 0 ; i < l ; i++ )
          if ( (p = strchr(Chaine, Liste[i])) != NULL )
             {
                 return p ;
             }
     
        return NULL ;
    }
     
    int Executer_Commande ( char *CommandLine )
    {
       char *p=NULL, *p0=NULL ;
     
       if ( CommandLine == NULL )
          return ERROR ;
     
       p0 = CommandLine ;
     
       p = Cherche_Separateur  ( CommandLine, " \n\t");
     
       /* Si un séparateur est trouvé, pon isole le premier mot */
       ìf ( p != NULL )  
          *p = '\0' ;
     
       /* Le premier mot donnera la commande */
       if ( strcasecmp(p0, "Quit") == 0 )
         {
             exit(0) ;  /* On sort normalement */
         }
     
       /* Commande "cd directory" */
       if ( strcasecmp (p0, "cd") == 0 )
        {
           return ( system ( (p+1) ) ) ;
        }
     
       /* On lance emacs en background */
        /* Commande rentrée : emacs  */
        if ( strstr ( p0, "emacs") != NULL )
          {
              if ( strchr( p0,  '&') != NULL )  /* Si on a entré "emacs&" */
                  return ( system(p0) );
              else
                {
                   *p = '&' ;  /* On ajoute le caractère disant le background */
                   *(p+1) = '\0' ;
     
                    return ( system(p0) ); 
                }
          }
     
       /* On a une commande à plusieurs paramètres */
        if ( strstr ( p0, "Macommandeaplusieursparamètres") != NULL )
          {
               /* Ici on analyse si on a besoin les mots */
          }
     
       return SUCCESS ;
    }
     
    int main(void)
    {
       int    continuer = SUCCESS;
       int    lu;
       char       command[MAXCOMMAND+2];
       int        length, i;
     
       /*
         ---------------------------
          Boucle d'affichage
         ---------------------------
       */
       while (continuer == SUCCESS)
       {
          printf ("Commande : \n" );
          fflush (stdout);
     
          lu = 1;
          if (fgets (command, MAXCOMMAND+2, stdin) == NULL)
          {
             lu = 0;
             if ( feof (stdin) )
                continuer = ERROR;
          }
     
          if (lu == 1)
          {
     
             length = 0;
             while (command[length++] != '\0')
                ;
     
             if (command[length - 2] == '\n')
             {
                command[length - 2] = '\0';
                continuer = Executer_Commande (command);
             }
             else
             {
                fprintf (stderr, "Command too long, max = %d\n", MAXCOMMAND);
     
                while (getc(stdin) != '\n')
                   ;
             }
          }
       }
     
      return EXIT_SUCCESS ;
    }
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  11. #11
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 916
    Points
    17 916
    Billets dans le blog
    2
    Par défaut
    bon je viens de compiler sous Linux...

    1) bourré d'erreurs...

    compile avec -pedantic ...

    2) je vois ce que tu veux faire, et c'est pas comme ça qu'il faut s'y prendre...

    Mets voir un #define DEBUG et tu verras ta liste de mots n'est pas correcte, déjà au départ.

    Ensuite c'est du C, ce serait mieux sous le forum C.

    Enfin, voici un petit exemple :

    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
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
     
    #include <stdlib.h>
    #include <stdio.h>
     
    #define MAX_COMMAND 500
    #define SUCCESS  1
    #define ERROR      0
     
    char *Cherche_Separateur ( char *Chaine, char *Liste )
    {
      int i = 0, l ;
      char *p = NULL ;
     
        if ( Chaine == NULL )
          return NULL ;
        if ( Liste == NULL )
          return Chaine ;
     
        l = strlen(Liste) ;
        for ( i = 0 ; i < l ; i++ )
          if ( (p = strchr(Chaine, Liste[i])) != NULL )
             {
                 return p ;
             }
     
        return NULL ;
    }
     
    int Executer_Commande ( char *CommandLine )
    {
       char *p=NULL, *p0=NULL ;
     
       if ( CommandLine == NULL )
          return ERROR ;
     
       p0 = CommandLine ;
     
       p = Cherche_Separateur  ( CommandLine, " \n\t");
     
       /* Si un séparateur est trouvé, pon isole le premier mot */
       ìf ( p != NULL )  
          *p = '\0' ;
     
       /* Le premier mot donnera la commande */
       if ( strcasecmp(p0, "Quit") == 0 )
         {
             exit(0) ;  /* On sort normalement */
         }
     
       /* Commande "cd directory" */
       if ( strcasecmp (p0, "cd") == 0 )
        {
           return ( system ( (p+1) ) ) ;
        }
     
       /* On lance emacs en background */
        /* Commande rentrée : emacs  */
        if ( strstr ( p0, "emacs") != NULL )
          {
              if ( strchr( p0,  '&') != NULL )  /* Si on a entré "emacs&" */
                  return ( system(p0) );
              else
                {
                   *p = '&' ;  /* On ajoute le caractère disant le background */
                   *(p+1) = '\0' ;
     
                    return ( system(p0) ); 
                }
          }
     
       /* On a une commande à plusieurs paramètres */
        if ( strstr ( p0, "Macommandeaplusieursparamètres") != NULL )
          {
               /* Ici on analyse si on a besoin les mots */
          }
     
       return SUCCESS ;
    }
     
    int main(void)
    {
       int    continuer = SUCCESS;
       int    lu;
       char       command[MAXCOMMAND+2];
       int        length, i;
     
       /*
         ---------------------------
          Boucle d'affichage
         ---------------------------
       */
       while (continuer == SUCCESS)
       {
          printf ("Commande : \n" );
          fflush (stdout);
     
          lu = 1;
          if (fgets (command, MAXCOMMAND+2, stdin) == NULL)
          {
             lu = 0;
             if ( feof (stdin) )
                continuer = ERROR;
          }
     
          if (lu == 1)
          {
     
             length = 0;
             while (command[length++] != '\0')
                ;
     
             if (command[length - 2] == '\n')
             {
                command[length - 2] = '\0';
                continuer = Executer_Commande (command);
             }
             else
             {
                fprintf (stderr, "Command too long, max = %d\n", MAXCOMMAND);
     
                while (getc(stdin) != '\n')
                   ;
             }
          }
       }
     
      return EXIT_SUCCESS ;
    }
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  12. #12
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    1
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 1
    Points : 1
    Points
    1
    Par défaut

    if (mot[0] == 0)
    return;
    Heuuu c'est 2 lignes dans la fonction "decouper" me semble louche...essaie sans...
    Sinon pour le main+system() :
    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
    int main(int argc, char * argv[]){ 
        char ligne[MaxLigne]; 
        char *mot[MaxMot]; 
        int tmp; 
     
        tmp = fork();              // lancer le processus enfait 
        if (tmp < 0){ 
            perror("fork"); 
            continue; 
        } 
        if (tmp != 0){            // parent : attendre la fin de l'enfant 
            while(wait(0) != tmp); 
            continue; 
        } 
        system(ligne); 
        } 
        printf("Bye\n"); 
        return 0; 
    }

Discussions similaires

  1. Réponses: 0
    Dernier message: 03/08/2014, 22h31
  2. Lancer un processus en arrière-plan
    Par Morgan7469 dans le forum C#
    Réponses: 10
    Dernier message: 17/03/2011, 14h48
  3. Changer la priorité des processus d'arrière plan Oracle
    Par dcollart dans le forum Administration
    Réponses: 1
    Dernier message: 16/07/2010, 15h22
  4. Lancer sous la console dos un processus en arrière plan.
    Par ziad.shady dans le forum Scripts/Batch
    Réponses: 6
    Dernier message: 25/10/2009, 14h44

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