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.