Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications > Shell
Shell Vos questions sur l'utilisation des commandes shell
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 24/04/2007, 23h29   #1
Membre à l'essai
 
Inscription : août 2006
Messages : 171
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 171
Points : 21
Points : 21
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 :
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.
momeftah est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/04/2007, 01h27   #2
Expert Confirmé Sénior
 
Inscription : janvier 2007
Messages : 8 743
Détails du profil
Informations personnelles :
Âge : 54

Informations forums :
Inscription : janvier 2007
Messages : 8 743
Points : 9 978
Points : 9 978
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 :
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
souviron34 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/04/2007, 07h22   #3
Membre à l'essai
 
Inscription : août 2006
Messages : 171
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 171
Points : 21
Points : 21
Citation:

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 :
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.
momeftah est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/04/2007, 12h01   #4
Expert Confirmé Sénior
 
Inscription : janvier 2007
Messages : 8 743
Détails du profil
Informations personnelles :
Âge : 54

Informations forums :
Inscription : janvier 2007
Messages : 8 743
Points : 9 978
Points : 9 978
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
souviron34 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/04/2007, 12h03   #5
Membre à l'essai
 
Inscription : août 2006
Messages : 171
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 171
Points : 21
Points : 21
Par exemple emacs & .
Merci.
momeftah est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/04/2007, 12h09   #6
Expert Confirmé Sénior
 
Inscription : janvier 2007
Messages : 8 743
Détails du profil
Informations personnelles :
Âge : 54

Informations forums :
Inscription : janvier 2007
Messages : 8 743
Points : 9 978
Points : 9 978
__________________
"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
souviron34 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/04/2007, 12h12   #7
Membre à l'essai
 
Inscription : août 2006
Messages : 171
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 171
Points : 21
Points : 21
Citation:
Envoyé par souviron34
je l'ulitilise à quel endroi dans le code ?

merci.
momeftah est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/04/2007, 12h17   #8
Expert Confirmé Sénior
 
Inscription : janvier 2007
Messages : 8 743
Détails du profil
Informations personnelles :
Âge : 54

Informations forums :
Inscription : janvier 2007
Messages : 8 743
Points : 9 978
Points : 9 978
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
souviron34 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/04/2007, 12h33   #9
Membre à l'essai
 
Inscription : août 2006
Messages : 171
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 171
Points : 21
Points : 21
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.
momeftah est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/04/2007, 12h20   #10
Expert Confirmé Sénior
 
Inscription : janvier 2007
Messages : 8 743
Détails du profil
Informations personnelles :
Âge : 54

Informations forums :
Inscription : janvier 2007
Messages : 8 743
Points : 9 978
Points : 9 978
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 :
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
souviron34 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/04/2007, 12h20   #11
Expert Confirmé Sénior
 
Inscription : janvier 2007
Messages : 8 743
Détails du profil
Informations personnelles :
Âge : 54

Informations forums :
Inscription : janvier 2007
Messages : 8 743
Points : 9 978
Points : 9 978
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 :
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
souviron34 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/05/2007, 18h50   #12
Invité de passage
 
Inscription : mai 2007
Messages : 1
Détails du profil
Informations personnelles :
Âge : 24

Informations forums :
Inscription : mai 2007
Messages : 1
Points : 1
Points : 1

Citation:
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 :
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; 
}
Basque est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 16h06.


 
 
 
 
Partenaires

Hébergement Web