Examen de Système II
Licence - Septembre 2002
Exercice
- Les shells possèdent des commandes internes et externes. De quoi s'agit-il ?
- Donner l'exemple d'une commande qui ne peut être qu'interne. Justifiez.
- Écrire un programme dont l'exécution conduira à la création d'un processus zombi.
- Comment fait-on disparaître un processus zombi ?
- Écrire un programme affichant le numéro du signal qui lui a été envoyé;
- Que se passe-t'il lorsqu'on lui envoie le signal SIGKILL ?
Soit le programme suivant :
#include <unistd.h>
#include <stdio.h>
int main()
{
printf("Salut, ");
if ( fork() == 0 ) {
write(STDOUT_FILENO,"c'est moi\n",10);
} else {
write(STDOUT_FILENO,"c'est lui\n",10);
}
}
Quel sont les affichages produits lorsqu'on exécute le programme ? Justifiez.
Écrire un shell ayant les fonctionnalités suivantes :
- exécution de commandes en avant-plan;
- exécution de commandes en arrière-plan;
- support de commandes internes;
- les exécutions pouvant être limitées dans le temps à l'aide d'une borne définie par l'utilisateur.
On pourra considérer qu'une fonction permettant de décoder une ligne de commande est disponible :
int decode(const char *ligne,int &nargs,char ***args,int *delai,int *interne);
Cette fonction prenant en entrée la ligne et renvoie en retour :
- nargs le nombre d'arguments décodés;
- args le tableau des arguments;
- delai le délai maximum accordé à l'exécution de la commande (-1 si pas de délai);
- interne valant -1 si la commande est externe, sinon un entier indiquant de quelle commande interne il s'agit;
- le code de retour valant -1 en cas d'erreur sinon AVANTPLAN ou ARRIEREPLAN.
Écrire le code de la commande interne de l'exercice 1.
Utiliser les déclarations/définitions suivantes :
int commande_interne_1(int nargs,char **args) {
....
}
#define MAXCOMINT ...
int (*commandes_internes[MAXCOMINT])(int,char **) = { commande_interne_1, ... };
Jean-Baptiste Yunes
2002-09-16