Université Pierre et Marie Curie Master 2016 2017
PR : Travaux Dirigés 1. Prise en main

Cette première séance consiste en une prise en main de votre environnement de programmation et du site permettant de soumettre son travail. A chaque séance, vous sera fourni en annexe un Makefile, construit sur le même modèle. Vous placerez ce Makefile dans un répertoire dédié à la séance, et vous y créerez un sous-répertoire src où il s’attend à trouver vos sources C, en plus de celles qui vous seront éventuellement fournies. Vous vous servirez exclusivement de ce Makefile pour compiler vos programmes, qui vous servira également à exécuter les tests qui y sont inclus, déduits de l’énoncé. En fin de séance la commande make test doit pouvoir s’exécuter entièrement et sans erreurs.

Vous soumettrez vos réponses à l’aide du lien disponible sous chaque question.



Warning: fsockopen(): unable to connect to ssl://www-master.ufr-info-p6.jussieu.fr:8083 (Connection refused) in /dsk/www-master/html/2016/ecrire/inc/distant.php on line 699

Warning: fsockopen(): unable to connect to ssl://www-master.ufr-info-p6.jussieu.fr:8083 (Connection refused) in /dsk/www-master/html/2016/ecrire/inc/distant.php on line 699

Warning: fsockopen(): unable to connect to ssl://www-master.ufr-info-p6.jussieu.fr:8083 (Connection refused) in /dsk/www-master/html/2016/ecrire/inc/distant.php on line 699

1 Lecture d’un makefile

On considère le fichier Makefile fourni en annexe. A l’aide de la documentation Unix de la commande make ainsi que de la documentation plus spécifique de Gnu-make, répondez aux questions suivante :

  1. à quoi sert la ligne .SUFFIXES ?
  2. à quoi sert la ligne .PHONY ?
  3. à quoi sert la ligne $(BIN)%: $(OBJ)%.o $O ?
  4. à quoi sert la ligne $(OBJ)%.o: $(SRC)%.c $(HC) ?
  5. à quoi sert le signe "-" au début de certaines lignes ?
  6. à quoi sert le doublement du signe "$" à certains endroits ?
Fichier à créer : makefile-desc.txt

2 Création de processus

A l’aide de la fonction standard fork, définir la fonction

int nfork (int n)

qui crée n processus fils et renvoie :

Si la création d’un processus fils échoue, la fonction n’essaie pas de créer les autres fils. Dans ce cas, la fonction renvoie le nombre de fils qu’elle a pu créer (ou –1, si aucun fils n’a été créé). On pourra compléter cette fonction par une fonction main l’appliquant à un entier pas trop grand pour la tester.

Exemple d'appel :
$PWD/bin/nfork
Fichier à créer : src/nfork.c

3 Description des processus

On appelle à présent la fonction nfork avec la fonction main ci-dessous :

On rappelle que l’instruction ++i<N incrémente d’abord la variable i et ne compare qu’ensuite.

Si on suppose que fork n’échoue jamais, combien des processus sont-ils créés, processus principal inclus ? Représentez l’arborescence de processus créés, en spécifiant les affichages de chaque processus. On pourra s’aider de la fonction getpid.

Fichier à créer : description.txt

4 La fonction exec et ses variantes

On considère le programme ci-dessous :

 1: int main(int argc, char **argv) {
 2:     pid_t pid;
 3:      int  j=0; int i = 0;
 4:      while (i < 2) {
 5:         i ++;
 6:         if ((pid = fork ()) == -1) {
 7:            perror ("fork");
 8:            return errno;
 9:         }
10:         else if (pid == 0) j=i;
11:     }
12:     if (j == 2) {
13:         sleep (2);
14:         printf ("sans fils \n");
15:     }
16:     else {
17:       printf ("%d fils \n », (i-j) );
18:       while (j < i) {
19:            j++;
20:            wait (NULL);
21:       }
22:     }
23:     return EXIT_SUCCESS;
24: }  

Combien de processus sont-ils créés, processus principal inclus ? Faites l’arborescence des processus en montrant les affichages de chaque processus.

Si, au lieu d’appeler la fonction C sleep à la ligne 13, on appelle la commande Unix sleep qui se trouve dans le répertoire /bin à l’aide de la fonction execl, le nombre de processus créés et l’affichage changent-ils ?

Même question en utilisant execv.

Fichier à créer : exec.txt

5 Attente de processus

Ecrire un programme qui crée deux processus fils fils1 et fils2. Chaque fils crée un fils, fils1.1 et fils2.1 respectivement. Ces 4 processus ne font qu’imprimer leur PID et PPID. Dans le cas du processus fils2, il imprime aussi le PID de son frère aîné fils1. Les processus n’ayant pas de fils se terminent aussitôt, mais un processus qui a des fils (y compris le processus principal) ne se termine qu’après ceux-ci. On utilisera la fonction wait pour réaliser cette attente, à l’exclusion de toute autre méthode (fichiers, fonction sleep etc).

Exemple d'appel :
$PWD/bin/mon_frere
Fichier à créer : src/mon_frere.c

6 Annexes


makefile

exec_sleep.c

repeat_nfork.c