Précédent Remonter

9  Exercices


Exercice 8  
Question 1   Au vu du résultat des commandes suivantes, dessiner l'abre des processus d'une commande de la forme com1 ; com2 ; ... ; comn.
% who ; ps -f www ; date ; cd ; ls -F 
phm      tty1     Apr 28 22:26
lambert  tty2     Apr 24 13:34
UID        PID  PPID  C STIME TTY      STAT   TIME CMD
phm        580   566  0 Apr28 pts/1    S      0:00 -csh
phm       1016   580  0 11:24 pts/1    R      0:00 ps -f www
Sat Apr 29 11:24:45 CEST 2000
INBOX                          ens/
auto/                          public_html/
bin/                           tex/
back/                          tmp/
dm/                            usr/

Question 2   Écrire un programme C correspondant la commande shell
who ; ps -f www ; date ; cd ; ls -F 
On exécutera une suite d'exec(). La commande cd étant une commande interne du shell, on ne peut la lancer directement par un exec().

Question 3   Étudier le résultat de la commande suivante (comparer avec la commande précédente)
% who & ps -f www & date & cd & ls -F &
phm      tty1     Apr 28 22:26
lambert  tty2     Apr 24 13:34
UID        PID  PPID  C STIME TTY      STAT   TIME CMD
phm        580   566  0 Apr28 pts/1    S      0:00 -csh
phm       1213   580  0 11:27 pts/1    R      0:00 ps -f www
phm       1214   580  0 11:27 pts/1    S      0:00 date
phm       1216   580  0 11:28 pts/1    S      0:00 ls -F 
Sat Apr 29 11:27:35 CEST 2000
ChangeLog                      processus1.log
Makefile                       processus1.make
Readme                         processus1.tex
processus1.aux                 source
processus1.dvi                 tubes.tex
et écrire un programme C correspondant aux commandes shell
% who & ps -f www & date & cd & ls -F 
et
% who & ps -f www & date & cd & ls -F &

Exercice 9   Donner l'implantation sous forme d'un programme C des commandes shell suivantes :

tar xf foo.tar gee.txt && lpr gee.txt
et

tar xf foo.tar gee.txt || mail -s "il y a des erreurs" marquet@lifl.fr
Exercice 10   Au vu des résultats des commandes suivantes, dessiner l'arbre des processus d'une commande de la forme com1 | com2 | ... | comn.

% ps -f www | cat -n | tee foo | wc
      7      74     448
% cat foo
     1  UID        PID  PPID  C STIME TTY      STAT   TIME CMD
     2  phm        563   557  0 07:15 pts/1    S      0:00 -csh
     3  phm        672   563  0 08:29 pts/1    S      0:01 emacs
     4  phm       1169   563  0 11:26 pts/1    R      0:00 ps -f www
     5  phm       1170   563  0 11:26 pts/1    S      0:00 cat -n
     6  phm       1171   563  0 11:26 pts/1    S      0:00 tee foo
     7  phm       1172   563  0 11:26 pts/1    S      0:00 wc

Exercice 11   Le programme

#include <stdlib.h>

int main (void)
{
  system ("ps") ; 
}
a été compilé en un exécutable nommé monps placé dans votre répertoire d'accueil. La commande shell

% monps
est tapé dès la connexion. Quelles sont les affirmations suivantes correctes :
  1. Après affichage des processus en cours, le programme monps termine et le shell vous rend la main.
  2. Après affichage des processus en cours, la session se termine et vous êtes déconnecté.
  3. Il y a affichage de 2 processus.
  4. Il y a affichage de 3 processus.
  5. Il y a affichage de 4 processus.
  6. Il y a affichage de 5 processus.

Exercice 12   Quelles différences y a-t-il entre les appels système system() et execve() ?
  1. Il n'y a aucune différence.
  2. execve() permet d'exécuter le même programme plusieurs fois.
  3. execve() ne crée pas de nouveau processus.

Exercice 13   Lors de l'exécution d'un processus shell interactif de pid p, on lance la commande ps.
  1. Le processus p se transforme en un processus qui exécute ps.
  2. Le processus p crée un fils f qui exécute ps et attend la terminaison de p avant de terminer lui-même.
  3. Le processus p crée un fils f qui exécute ps, et p attend la terminaison de ce processus f avant de reprendre son exécution normale.
  4. Le processus p crée un fils f qui exécute ps, et reprend son exécution sans attendre la terminaison de f.

Exercice 14   Vous connaissez déjà l'appel système fork() pour créer un processus. Il en existe un autre, vfork(), qui a un comportement un peu différent : il n'y a pas recopie des données et de la pile, le nouveau processus les partage avec son père. Le processus père est suspendu jusqu'à ce que le fils fasse un appel à execve() ou termine.

Quels sont les avantages et les inconvénients de cet appel système ? Donnez un exemple de programme qui typiquement devrait se servir de vfork
().


Précédent Remonter