diff --git a/Theorie/C/datatypes.rst b/Theorie/C/datatypes.rst
index 4015b0a362660635894206deaacf46468c7f5157..6927710c6fc0c24046bc7d9fc731a34c781bf924 100644
--- a/Theorie/C/datatypes.rst
+++ b/Theorie/C/datatypes.rst
@@ -85,7 +85,7 @@ convention préfixé par ``0x`` tandis qu'un nombre entier en notation
 binaire est préfixé par ``0b``. Ainsi, les déclarations ci-dessous
 correspondent toutes à la même valeur.
 
-.. literalinclude:: /C/S2-src/num.c
+.. literalinclude:: /_static/src/C/S2-src/num.c
    :encoding: utf-8
    :language: c
    :start-after: ///AAA
@@ -109,7 +109,7 @@ contrairement à la notation hexadécimale qui fait partie du langage.
  ``65 et 53 sont différents`` car le compilateur C interprète la ligne
  ``j=065;`` comme contenant un entier en notation octale et non décimale.
 
- .. literalinclude:: /C/S2-src/octal.c
+ .. literalinclude:: /_static/src/C/S2-src/octal.c
     :encoding: utf-8
     :language: c
     :start-after: ///AAA
@@ -240,7 +240,7 @@ peut causer des erreurs dans certains calculs. Par exemple,
 voici un petit programme qui affiche les 10 premières puissances de
 cinq et dix.
 
-.. literalinclude:: /C/S2-src/short.c
+.. literalinclude:: /_static/src/C/S2-src/short.c
    :encoding: utf-8
    :language: c
    :start-after: ///AAA
@@ -248,7 +248,7 @@ cinq et dix.
 
 Lorsqu'il est exécuté, ce programme affiche la sortie suivante.
 
-.. literalinclude:: /C/S2-src/short.out
+.. literalinclude:: /_static/src/C/S2-src/short.out
    :encoding: utf-8
    :language: console
 
@@ -316,7 +316,7 @@ Les tableaux
 
 En langage C, les tableaux permettent d'agréger des données d'un même type. Il est possible de définir des vecteurs et des matrices en utilisant la syntaxe ci-dessous.
 
-.. literalinclude:: /C/S2-src/array.c
+.. literalinclude:: /_static/src/C/S2-src/array.c
    :language: c
    :encoding: utf-8
    :start-after: ///AAA
@@ -326,7 +326,7 @@ Les premières versions du langage C ne permettaient que la définition de table
 
 Un tableau à une dimension peut s'utiliser avec une syntaxe similaire à celle utilisée par Java. Dans un tableau contenant ``n`` éléments, le premier se trouve à l'indice ``0`` et le dernier à l'indice ``n-1``. L'exemple ci-dessous présente le calcul de la somme des éléments d'un vecteur.
 
-.. literalinclude:: /C/S2-src/array.c
+.. literalinclude:: /_static/src/C/S2-src/array.c
    :language: c
    :encoding: utf-8
    :start-after: ///CCC
@@ -334,7 +334,7 @@ Un tableau à une dimension peut s'utiliser avec une syntaxe similaire à celle
 
 Le langage C permet aussi la manipulation de matrices carrées ou rectangulaires qui sont composées d'éléments d'un même type. L'exemple ci-dessous calcule l'élément minimum d'une matrice rectangulaire. Il utilise la constante ``FLT_MAX`` qui correspond au plus grand nombre réel représentable avec un ``float`` et qui est définie dans `float.h`_.
 
-.. literalinclude:: /C/S2-src/array.c
+.. literalinclude:: /_static/src/C/S2-src/array.c
    :language: c
    :encoding: utf-8
    :start-after: ///EEE
@@ -374,7 +374,7 @@ caractères. À titre d'exemple, une fonction `toupper(3)`_ permettant
 de transformer un caractère représentant une minuscule dans le
 caractère représentant la majuscule correspondante peut s'écrire :
 
-.. literalinclude:: /C/S2-src/toupper.c
+.. literalinclude:: /_static/src/C/S2-src/toupper.c
    :language: c
    :encoding: utf-8
    :start-after: ///AAA
@@ -441,7 +441,7 @@ fonctions de manipulation de chaînes de
 caractères. À titre d'exemple, la fonction ci-dessous calcule
 la longueur d'une chaîne de caractères.
 
-.. literalinclude:: /C/S2-src/strlen.c
+.. literalinclude:: /_static/src/C/S2-src/strlen.c
    :encoding: utf-8
    :language: c
    :start-after: ///AAA
@@ -556,7 +556,7 @@ donnée. Les adresses de données en mémoire sont rarement affichées,
 mais quand c'est le cas, on utilise la notation hexadécimale comme
 dans l'exemple ci-dessous.
 
-.. literalinclude:: /C/S2-src/ptr.c
+.. literalinclude:: /_static/src/C/S2-src/ptr.c
    :encoding: utf-8
    :language: c
    :start-after: ///AAA
@@ -564,7 +564,7 @@ dans l'exemple ci-dessous.
 
 L'exécution de ce fragment de programme produit la sortie suivante.
 
-.. literalinclude:: /C/S2-src/ptr.out
+.. literalinclude:: /_static/src/C/S2-src/ptr.out
    :encoding: utf-8
    :language: console
 
@@ -591,7 +591,7 @@ l'expression ``*ptr``. Il est
 représenté dans l'exemple ci-dessous.
 
 
-.. literalinclude:: /C/S2-src/ptrex.c
+.. literalinclude:: /_static/src/C/S2-src/ptrex.c
    :encoding: utf-8
    :language: c
    :start-after: ///AAA
@@ -599,7 +599,7 @@ représenté dans l'exemple ci-dessous.
 
 L'exécution de ce fragment de programme produit la sortie suivante.
 
-.. literalinclude:: /C/S2-src/ptrex.out
+.. literalinclude:: /_static/src/C/S2-src/ptrex.out
    :encoding: utf-8
    :language: console
 
@@ -609,7 +609,7 @@ En pratique en C, les notations ``char*`` et ``char[]`` sont
 les pointeurs, la fonction de calcul de la longueur d'une chaîne de
 caractères peut se réécrire comme suit.
 
-.. literalinclude:: /C/S2-src/strlenptr.c
+.. literalinclude:: /_static/src/C/S2-src/strlenptr.c
    :encoding: utf-8
    :language: c
    :start-after: ///AAA
@@ -618,7 +618,7 @@ caractères peut se réécrire comme suit.
 
 Les pointeurs sont fréquemment utilisés dans les programmes écrits en langage C et il est important de bien comprendre leur fonctionnement. Un point important à bien comprendre est ce que l'on appelle l'`arithmétique des pointeurs`, c'est-à-dire la façon dont les opérations sur les pointeurs sont exécutées en langage C. Pour cela, il est intéressant de considérer la manipulation d'un tableau d'entiers à travers des pointeurs.
 
-.. literalinclude:: /C/src/ptr_arith.c
+.. literalinclude:: /_static/src/C/src/ptr_arith.c
    :encoding: utf-8
    :language: c
    :start-after: ///AAA
@@ -626,7 +626,7 @@ Les pointeurs sont fréquemment utilisés dans les programmes écrits en langage
 
 En mémoire, ce tableau est stocké en utilisant trois mots consécutifs de 32 bits comme le montre l'exécution du programme ci-dessous :
 
-.. literalinclude:: /C/src/ptr_arith.c
+.. literalinclude:: /_static/src/C/src/ptr_arith.c
    :encoding: utf-8
    :language: c
    :start-after: ///CCC
@@ -640,7 +640,7 @@ En mémoire, ce tableau est stocké en utilisant trois mots consécutifs de 32 b
 
 La même sortie est produite avec le fragment de programme suivant qui utilise un pointeur.
 
-.. literalinclude:: /C/src/ptr_arith.c
+.. literalinclude:: /_static/src/C/src/ptr_arith.c
    :encoding: utf-8
    :language: c
    :start-after: ///EEE
@@ -658,7 +658,7 @@ Après l'exécution de la première ligne, ``ptr`` va contenir l'adresse de l'é
 
 Il est intéressant pour terminer cette première discussion de l'arithmétique des pointeurs, de considérer l'exécution du fragment de code ci-dessous.
 
-.. literalinclude:: /C/src/ptr_arith.c
+.. literalinclude:: /_static/src/C/src/ptr_arith.c
    :encoding: utf-8
    :language: c
    :start-after: ///GGG
@@ -686,7 +686,7 @@ Outre les types de données décrits ci-dessus, les programmes informatiques doi
 
 C permet la définition de structures qui combinent différents types de données simples ou structurés. Contrairement aux langages orientés objet, il n'y a pas de méthode directement associée aux structures qui sont définies. Une structure est uniquement un type de données. Voici quelques exemples de structures simples en C.
 
-.. literalinclude:: /C/S2-src/struct.c
+.. literalinclude:: /_static/src/C/S2-src/struct.c
    :encoding: utf-8
    :language: c
    :start-after: ///AAA
@@ -698,7 +698,7 @@ La structure ``struct fract`` définit une fraction qui est composée de deux en
 
 Les structures permettent de facilement regrouper des données qui sont logiquement reliées entre elles et doivent être manipulées en même temps. C permet d'accéder facilement à un élément d'une structure en utilisant l'opérateur '``.``'. Ainsi, la structure ``point`` dont nous avons parlé ci-dessus aurait pu être initialisée par les trois expressions ci-dessous :
 
-.. literalinclude:: /C/S2-src/struct.c
+.. literalinclude:: /_static/src/C/S2-src/struct.c
    :encoding: utf-8
    :language: c
    :start-after: ///CCC
@@ -724,7 +724,7 @@ Les structures sont également fréquemment utilisées pour représenter des for
 
 La définition de ``struct timeval`` utilise une fonctionnalité fréquemment utilisée du C : la possibilité de définir des alias pour des noms de type de données existants. Cela se fait en utilisant l'opérateur ``typedef``. En C, il est possible de renommer des types de données existants. Ainsi, l'exemple ci-dessous utilise ``typedef`` pour définir ``Entier`` comme alias pour le type ``int`` et ``Fraction`` pour la structure ``struct fraction``.
 
-.. literalinclude:: /C/S2-src/typedef.c
+.. literalinclude:: /_static/src/C/S2-src/typedef.c
    :encoding: utf-8
    :language: c
    :start-after: ///AAA
@@ -739,7 +739,7 @@ Les types ``Entier`` et ``int`` peuvent être utilisés de façon interchangeabl
 
  ``typedef`` est souvent utilisé pour avoir des identifiants de types de données plus courts. Par exemple, il est très courant de remplacer le types ``unsigned`` par les abréviations ci-dessous.
 
-  .. literalinclude:: /C/S2-src/typedef.c
+  .. literalinclude:: /_static/src/C/S2-src/typedef.c
      :encoding: utf-8
      :language: c
      :start-after: ///EEE
@@ -747,7 +747,7 @@ Les types ``Entier`` et ``int`` peuvent être utilisés de façon interchangeabl
 
  Soyez prudents si vous utilisez des ``typedef`` pour redéfinir des pointeurs. En C, il est tout à fait valide d'écrire les lignes suivantes.
 
-  .. literalinclude:: /C/S2-src/typedef.c
+  .. literalinclude:: /_static/src/C/S2-src/typedef.c
      :encoding: utf-8
      :language: c
      :start-after: ///CCC
@@ -758,7 +758,7 @@ Les types ``Entier`` et ``int`` peuvent être utilisés de façon interchangeabl
 
 Les pointeurs sont fréquemment utilisés lors de la manipulation de structures. Lorsqu'un pointeur pointe vers une structure, il est utile de pouvoir accéder facilement aux éléments de la structure. Le langage C supporte deux notations pour représenter ces accès aux éléments d'une structure. La première notation est ``(*ptr).elem``  où ``ptr`` est un pointeur et ``elem`` l'identifiant d'un des éléments de la structure pointée par ``ptr``. Cette notation est en pratique assez peu utilisée. La notation la plus fréquente est ``ptr->elem`` dans laquelle ``ptr`` et ``->elem`` sont respectivement un pointeur et un identifiant d'élément. L'exemple ci-dessous illustre l'initialisation de deux fractions en utilisant ces notations.
 
-.. literalinclude:: /C/S2-src/structptr.c
+.. literalinclude:: /_static/src/C/S2-src/structptr.c
    :encoding: utf-8
    :language: c
    :start-after: ///AAA
@@ -774,7 +774,7 @@ Comme la plupart des langages, le C permet de faciliter la compréhension d'un p
 en le découpant en de nombreuses fonctions. Chacune réalise une
 tâche simple. Tout comme Java, C permet la définition de fonctions qui ne retournent aucun résultat. Celles-ci sont de type ``void`` comme l'exemple trivial ci-dessous.
 
-.. literalinclude:: /C/S2-src/fct.c
+.. literalinclude:: /_static/src/C/S2-src/fct.c
    :encoding: utf-8
    :language: c
    :start-after: ///AAA
@@ -782,7 +782,7 @@ tâche simple. Tout comme Java, C permet la définition de fonctions qui ne reto
 
 La plupart des fonctions utiles retournent un résultat qui peut être une donnée d'un des types standard ou une structure. Cette utilisation est similaire à ce que l'on trouve dans des langages comme Java. Il faut cependant être attentif à la façon dont le langage C traite les arguments des fonctions. Le langage C utilise le `passage par valeur` des arguments. Lorsqu'une fonction est exécutée, elle reçoit les valeurs de ces arguments. Ces valeurs sont stockées dans une zone mémoire qui est locale à la fonction. Toute modification faite sur la valeur d'une variable à l'intérieur d'une fonction est donc locale à cette fonction. Les deux fonctions ci-dessous ont le même résultat et aucune des deux n'a d'effet de bord.
 
-.. literalinclude:: /C/S2-src/fct.c
+.. literalinclude:: /_static/src/C/S2-src/fct.c
    :encoding: utf-8
    :language: c
    :start-after: ///CCC
@@ -790,7 +790,7 @@ La plupart des fonctions utiles retournent un résultat qui peut être une donn
 
 Il faut être nettement plus attentif lorsque l'on écrit des fonctions qui utilisent des pointeurs comme arguments. Lorsqu'une fonction a un argument de type pointeur, celui-ci est passé par valeur, mais connaissant la valeur du pointeur, il est possible à la fonction de modifier le contenu de la zone mémoire pointée par le pointeur. Ceci est illustré par l'exemple ci-dessous.
 
-.. literalinclude:: /C/S2-src/fct.c
+.. literalinclude:: /_static/src/C/S2-src/fct.c
    :encoding: utf-8
    :language: c
    :start-after: ///EEE
@@ -798,13 +798,13 @@ Il faut être nettement plus attentif lorsque l'on écrit des fonctions qui util
 
 Lors de l'exécution de la fonction ``f``, le programme ci-dessus affiche à la console la sortie suivante :
 
-.. literalinclude:: /C/S2-src/fct.out
+.. literalinclude:: /_static/src/C/S2-src/fct.out
    :encoding: utf-8
    :language: console
 
 Cet exemple illustre aussi une contrainte imposée par le langage C sur l'ordre de définition des fonctions. Pour que les fonctions ``times_two`` et ``timestwo`` puissent être utilisées à l'intérieur de la fonction ``f``, il faut qu'elles aient été préalablement définies. Dans l'exemple ci-dessus, cela s'est fait en plaçant la définition des deux fonctions avant leur utilisation. C'est une règle de bonne pratique utilisable pour de petits programmes composés de quelques fonctions. Pour des programmes plus larges, il est préférable de placer au début du code source la signature des fonctions qui y sont définies. La signature d'une fonction comprend le type de valeur de retour de la fonction, son nom et les types de ses arguments. Généralement, ces déclarations sont regroupées à l'intérieur d'un :term:`fichier header` dont le nom se termine par ``.h``.
 
-.. literalinclude:: /C/S2-src/fct.h
+.. literalinclude:: /_static/src/C/S2-src/fct.h
    :encoding: utf-8
    :language: c
    :start-after: ///HHH
@@ -812,7 +812,7 @@ Cet exemple illustre aussi une contrainte imposée par le langage C sur l'ordre
 
 Les fonctions peuvent évidemment recevoir également des tableaux comme arguments. Cela permet par exemple d'implémenter une fonction qui calcule la longueur d'une chaîne de caractères en itérant dessus jusqu'à trouver le caractère de fin de chaîne.
 
-.. literalinclude:: /C/S2-src/strlenptr.c
+.. literalinclude:: /_static/src/C/S2-src/strlenptr.c
    :encoding: utf-8
    :language: c
    :start-after: ///AAA
@@ -826,7 +826,7 @@ Tout comme cette fonction peut accéder au `ième` caractère de la chaîne pass
 
 Un autre exemple de fonctions qui manipulent les tableaux sont des fonctions mathématiques qui traitent des vecteurs par exemple.
 
-.. literalinclude:: /C/S2-src/fctargs.c
+.. literalinclude:: /_static/src/C/S2-src/fctargs.c
    :encoding: utf-8
    :language: c
    :start-after: ///CCC
@@ -835,7 +835,7 @@ Un autre exemple de fonctions qui manipulent les tableaux sont des fonctions mat
 
 Ces deux fonctions peuvent être utilisées par le fragment de code ci-dessous :
 
-.. literalinclude:: /C/S2-src/fctargs.c
+.. literalinclude:: /_static/src/C/S2-src/fctargs.c
    :encoding: utf-8
    :language: c
    :start-after: ///EEE
@@ -846,7 +846,7 @@ Ces deux fonctions peuvent être utilisées par le fragment de code ci-dessous :
 
  Certains langages comme Java sont fortement typés et le compilateur contient de nombreuses vérifications, notamment sur les types de données utilisés, qui permettent d'éviter un grand nombre d'erreurs. Le langage C est lui nettement plus libéral. Les premiers compilateurs C étaient très permissifs notamment sur les types de données passés en arguments. Ainsi, un ancien compilateur C accepterait probablement sans broncher les appels suivants :
 
-  .. literalinclude:: /C/S2-src/fctargs.c
+  .. literalinclude:: /_static/src/C/S2-src/fctargs.c
      :encoding: utf-8
      :language: c
      :start-after: ///GGG
@@ -863,7 +863,7 @@ Ces deux fonctions peuvent être utilisées par le fragment de code ci-dessous :
 
 Pour terminer, mentionnons que les fonctions écrites en C peuvent utiliser des structures et des pointeurs vers des structures comme arguments. Elles peuvent aussi retourner des structures comme résultat. Ceci est illustré par deux variantes de fonctions permettant d'initialiser une fraction et de déterminer si deux fractions sont égales [#fegal]_.
 
-.. literalinclude:: /C/S2-src/struct.c
+.. literalinclude:: /_static/src/C/S2-src/struct.c
    :encoding: utf-8
    :language: c
    :start-after: ///EEE
@@ -873,7 +873,7 @@ Considérons d'abord les fonctions ``init`` et ``equal``. ``init`` est une fonct
 
 Les fonctions ``initptr`` et ``equalptr`` utilisent toutes les deux des pointeurs vers des ``struct fraction`` comme arguments. Ce faisant, elles ne peuvent modifier la valeur de ces pointeurs puisqu'ils sont passés comme valeurs. Par contre, les deux fonctions peuvent bien entendu modifier les éléments de la structure qui se trouvent dans la zone de mémoire pointée par le pointeur. C'est ce que ``initptr`` fait pour initialiser la structure. ``equalptr`` par contre se contente d'accéder aux éléments des structures passées en argument sans les modifier. Le fragment de code ci-dessous illustre comment ces fonctions peuvent être utilisées en pratique.
 
-.. literalinclude:: /C/S2-src/struct.c
+.. literalinclude:: /_static/src/C/S2-src/struct.c
    :encoding: utf-8
    :language: c
    :start-after: ///GGG
@@ -941,13 +941,13 @@ Ces opérations peuvent être combinées entre elles. Pour des raisons technolog
 
 Ces opérations binaires peuvent s'étendre à des séquences de bits. Voici quelques exemples qui permettent d'illustrer ces opérations sur des octets.
 
-.. literalinclude:: /C/S2-src/exprbin.out
+.. literalinclude:: /_static/src/C/S2-src/exprbin.out
    :encoding: utf-8
    :language: console
 
 En C, ces expressions logiques s'utilisent comme dans le fragment de code suivant. En général, elles s'utilisent sur des représentations non signées, souvent des ``unsigned char`` ou des ``unsigned int``.
 
-.. literalinclude:: /C/S2-src/exprbin.c
+.. literalinclude:: /_static/src/C/S2-src/exprbin.c
    :encoding: utf-8
    :language: c
    :start-after: ///AAA
@@ -955,7 +955,7 @@ En C, ces expressions logiques s'utilisent comme dans le fragment de code suivan
 
 En pratique, les opérations logiques sont utiles pour effectuer des manipulations au niveau des bits de données stockées en mémoire. Une utilisation fréquente dans certaines applications réseaux ou systèmes est de forcer certains bits à prendre la valeur ``0`` ou ``1``. La conjonction logique permet de forcer facilement un bit à zéro tandis que la disjonction logique permet de forcer facilement un bit à un. L'exemple ci-dessous montre comment forcer les valeurs de certains bits dans un ``unsigned char``. Il peut évidemment se généraliser à des séquences de bits plus longues.
 
-.. literalinclude:: /C/S2-src/exprbin.c
+.. literalinclude:: /_static/src/C/S2-src/exprbin.c
    :encoding: utf-8
    :language: c
    :start-after: ///CCC
@@ -967,7 +967,7 @@ En pratique, les opérations logiques sont utiles pour effectuer des manipulatio
                 
 L'opération XOR joue un rôle important dans certaines applications. La plupart des méthodes de chiffrement et de déchiffrement utilisent de façon extensive cette opération. Une des propriétés intéressantes de l'opération XOR est que :math:`(A \oplus B) \oplus B=A`. Cette propriété est largement utilisée par les méthodes de chiffrement. La méthode développée par Vernam au début du vingtième siècle s'appuie sur l'opération XOR. Pour transmettre un message `M` de façon sûre, elle applique l'opération XOR bit à bit entre tous les bits du message `M` et une clé `K` doit avoir au moins le même nombre de bits que `M`. Si cette clé `K` est totalement aléatoire et n'est utilisée qu'une seule fois, alors on parle de *one-time-pad*. On peut montrer que dans ce cas, la méthode de chiffrement est totalement sûre. En pratique, il est malheureusement difficile d'avoir une clé totalement aléatoire qui soit aussi longue que le message à transmettre. Le programme ci-dessous implémente cette méthode de façon triviale. La fonction `memfrob(3)`_ de la librairie :term:`GNU` utilise également un chiffrement via un XOR.
 
-.. literalinclude:: /C/S2-src/xor.c
+.. literalinclude:: /_static/src/C/S2-src/xor.c
    :encoding: utf-8
    :language: c
    :start-after: ///AAA
@@ -993,7 +993,7 @@ Pour terminer, le langage C supporte des expressions permettant le décalage à
 
 Ces opérations de décalage permettent différentes manipulations de bits. À titre d'exemple, la fonction ``int2bin`` utilise à la fois des décalages et des masques pour calculer la représentation binaire d'un entier non signé et la placer dans une chaîne de caractères.
 
-.. literalinclude:: /C/S2-src/exprbin.c
+.. literalinclude:: /_static/src/C/S2-src/exprbin.c
    :encoding: utf-8
    :language: c
    :start-after: ///EEE
diff --git a/Theorie/C/linker.rst b/Theorie/C/linker.rst
index 8da9e02fb718d89751294986b3fd1b9c7ea88402..566866d50795a81aba34f5f15e4b6cddb8279e5d 100644
--- a/Theorie/C/linker.rst
+++ b/Theorie/C/linker.rst
@@ -33,7 +33,7 @@ Un premier exemple sont les pointeurs vers des fonctions. Comme nous l'avons vu
 
 Cette application qui supporte plusieurs niveaux de débogage utilise pourtant toujours le même appel pour afficher l'information de débogage : ``(debug_print[debug_level])(...);``. Cet appel profite des pointeurs vers les fonctions. Le tableau ``debug_print`` est un tableau de pointeurs vers des fonctions qui chacune prend comme argument un ``char *``. La variable globale ``debug_level`` est initialisée sur base de l'argument passé au programme.
 
-.. literalinclude:: /C/S5-src/fctptr.c
+.. literalinclude:: /_static/src/C/S5-src/fctptr.c
    :encoding: utf-8
    :language: c
    :start-after: ///AAA
@@ -49,7 +49,7 @@ Ce n'est pas la seule utilisation des pointeurs vers des fonctions. Il y a notam
 
 Le premier est un pointeur vers le début de la zone mémoire à trier. Le second est le nombre d'éléments à trier. Le troisième contient la taille des éléments stockés dans le tableau. Le quatrième argument est un pointeur vers la fonction qui permet de comparer deux éléments du tableau. Cette fonction retourne un entier négatif si son premier argument est inférieur au second et positif ou nul sinon. Un exemple de fonction de comparaison est la fonction `strcmp(3)`_ de la librairie standard. Un autre exemple est repris ci-dessous avec une fonction de comparaison simple qui permet d'utiliser `qsort(3)`_ pour trier un tableau de ``double``.
 
-.. literalinclude:: /C/S5-src/qsort.c
+.. literalinclude:: /_static/src/C/S5-src/qsort.c
    :encoding: utf-8
    :language: c
    :start-after: ///AAA
@@ -60,7 +60,7 @@ Il est utile d'analyser en détails les arguments de la fonction de comparaison
 
 Le second type de pointeurs que nous n'avons pas encore abordé en détails sont les pointeurs vers des pointeurs. En fait, nous les avons utilisés sans vraiment le savoir dans la fonction ``main``. En effet, le second argument de cette fonction est un tableau de pointeurs qui pointent chacun vers des chaînes de caractères différentes. La notation ``char *argv[]`` est équivalente à la notation ``char **argv``. ``**argv`` est donc un pointeur vers une zone qui contient des pointeurs vers des chaînes de caractères. Ce pointeur vers un pointeur doit être utilisé avec précaution. ``argv[0]`` est un pointeur vers une chaîne de caractères. La construction ``&(argv[0])`` permet donc d'obtenir un pointeur vers un pointeur vers une chaîne de caractères, ce qui correspond bien à la déclaration ``char **``. Ensuite, l'utilisation de ``*p`` pourrait surprendre. ``*p`` est un pointeur vers une chaîne de caractères. Il peut donc être comparé à ``NULL`` qui est aussi un pointeur, incrémenté et la chaîne de caractères qu'il référence peut être affichée par `printf(3)`_.
 
-.. literalinclude:: /C/S5-src/ptrptr.c
+.. literalinclude:: /_static/src/C/S5-src/ptrptr.c
    :encoding: utf-8
    :language: c
    :start-after: ///AAA
@@ -82,14 +82,14 @@ L'utilisation principale de `strtol(3)`_ est de convertir une chaîne de caract
 
 `strtol(3)`_ est un exemple de fonction qui doit retourner deux types d'informations. Tout d'abord, `strtol(3)`_ retourne un résultat (dans ce cas un nombre). Si la chaîne de caractères à convertir est erronée, `strtol(3)`_ convertit le début de la chaîne et retourne un pointeur indiquant le premier caractère en erreur. Pour bien comprendre le fonctionnement de `strtol(3)`_, considérons l'exemple ci-dessous.
 
-.. literalinclude:: /C/S5-src/strtol.c
+.. literalinclude:: /_static/src/C/S5-src/strtol.c
    :encoding: utf-8
    :language: c
    :start-after: ///AAA
 
 Lors de son exécution, ce programme affiche la sortie suivante.
 
-.. literalinclude:: /C/S5-src/strtol.out
+.. literalinclude:: /_static/src/C/S5-src/strtol.out
    :encoding: utf-8
    :language: console
 
@@ -97,7 +97,7 @@ L'appel à `strtol(3)`_ prend trois arguments. Tout d'abord un pointeur vers la
 
 Une implémentation partielle de `strtol(3)`_ pourrait être la suivante.
 
-.. literalinclude:: /C/S5-src/mystrtol.c
+.. literalinclude:: /_static/src/C/S5-src/mystrtol.c
    :encoding: utf-8
    :language: c
    :start-after: ///AAA
@@ -116,7 +116,7 @@ Lorsque l'on développe de grands programmes en C, il est préférable de décou
 
 Pour comprendre l'utilisation de ces modules, considérons d'abord un programme trivial composé de deux modules. Le premier module est celui qui contient la fonction ``main``. Tout programme C doit contenir une fonction ``main`` pour pouvoir être exécuté. C'est en général l'interface avec l'utilisateur. Le second module contient une fonction générique qui est utilisée par le module principal.
 
-.. literalinclude:: /C/S5-src/main.c
+.. literalinclude:: /_static/src/C/S5-src/main.c
    :encoding: utf-8
    :language: c
 
@@ -126,7 +126,7 @@ Un module d'un programme C est en général décomposé en deux parties. Tout d'
  - les constantes qui sont utilisées à l'intérieur du module et doivent être visibles en dehors de celui-ci, notamment par les modules qui utilisent les fonctions du module. Ces constantes peuvent être définies en utilisant des directives ``#define`` du préprocesseur
  - les variables globales qui sont utilisées par les fonctions du module et doivent être accessibles en dehors de celui-ci
 
-.. literalinclude:: /C/S5-src/min.h
+.. literalinclude:: /_static/src/C/S5-src/min.h
    :encoding: utf-8
    :language: c
 
@@ -134,7 +134,7 @@ Un module d'un programme C est en général décomposé en deux parties. Tout d'
 
  L'exemple de :term:`fichier header` ci-dessus illustre une convention courante dans l'écriture de ces fichiers. Parfois, il est nécessaire d'inclure un :term:`fichier header` dans un autre fichier header. Suite à cela, il est possible que les mêmes définitions d'un :term:`fichier header` soient incluses deux fois ou plus dans le même module. Cela peut causer des erreurs de compilation qui risquent de perturber certains programmeurs. Une règle de bonne pratique pour éviter ce problème est d'inclure le contenu du :term:`fichier header` de façon conditionnelle comme présenté ci-dessus. Une constante, dans ce cas ``_MIN_H_``, est définie pour le :term:`fichier header` concerné. Cette constante est définie dans la première ligne effective du :term:`fichier header`. Celui-ci n'est inclus dans un module que si cette constante n'a pas été préalablement définie. Si cette constante est connue par le préprocesseur, cela indique qu'un autre :term:`fichier header` a déjà inclus les définitions de ce fichier et qu'elles ne doivent pas être incluses une seconde fois.
 
-.. literalinclude:: /C/S5-src/min.c
+.. literalinclude:: /_static/src/C/S5-src/min.c
    :encoding: utf-8
    :language: c
 
@@ -144,7 +144,7 @@ Un module d'un programme C est en général décomposé en deux parties. Tout d'
 
 Lorsque l'on doit compiler un programme qui fait appel à plusieurs modules, quelle que soit sa taille, il est préférable d'utiliser `make(1)`_ pour automatiser sa compilation. Le fichier ci-dessous est un petit exemple de :term:`Makefile` utilisable pour un tel projet.
 
-.. literalinclude:: /C/S5-src/Makefile2
+.. literalinclude:: /_static/src/C/S5-src/Makefile2
    :encoding: utf-8
    :language: makefile
    :start-after: ###AAA
@@ -176,17 +176,17 @@ Il faut noter que ``static`` peut aussi précéder des déclarations de fonction
 
 Afin d'illustrer l'utilisation de ``static`` et ``extern``, considérons le programme ``prog.c`` ci-dessous qui inclut le module ``module.c`` et également le module ``min.c`` présenté plus haut.
 
-.. literalinclude:: /C/S5-src/module.h
+.. literalinclude:: /_static/src/C/S5-src/module.h
    :encoding: utf-8
    :language: c
 
-.. literalinclude:: /C/S5-src/module.c
+.. literalinclude:: /_static/src/C/S5-src/module.c
    :encoding: utf-8
    :language: c
 
 Ce module contient deux fonctions, ``vmin`` et ``min``. ``vmin`` est accessible depuis n'importe quel module. Sa signature est reprise dans le :term:`fichier header` ``module.h``. La fonction ``min`` par contre est déclarée comme étant ``static``. Cela implique qu'elle n'est utilisable qu'à l'intérieur de ce module et invisible de tout autre module. La variable globale ``num1`` est accessible depuis n'importe quel module. La variable ``num2`` également, mais elle est initialisée dans un autre module. Enfin, la variable ``num3`` n'est accessible qu'à l'intérieur de ce module.
 
-.. literalinclude:: /C/S5-src/prog.c
+.. literalinclude:: /_static/src/C/S5-src/prog.c
    :encoding: utf-8
    :language: c
    :start-after: ///AAA
@@ -195,7 +195,7 @@ Ce module inclus les fichiers ``min.h`` et ``module.h`` qui contiennent les sign
 
 La fonction ``f`` mérite que l'on s'y attarde un peu. Cette fonction contient la définition de la variable ``static n``. Même si cette variable est locale à la fonction ``f`` et donc invisible en dehors de cette fonction, le compilateur va lui réserver une place dans la même zone que les variables globales. La valeur de cette variable ``static`` sera initialisée une seule fois : au démarrage du programme. Même si cette variable parait être locale, elle ne sera jamais réinitialisée lors d'un appel à la fonction ``f``. Comme cette variable est stockée en dehors de la pile, elle conserve sa valeur d'une invocation à l'autre de la fonction ``f``. Ceci est illustré par l'exécution du programme qui produit la sortie suivante.
 
-.. literalinclude:: /C/S5-src/prog.out
+.. literalinclude:: /_static/src/C/S5-src/prog.out
    :encoding: utf-8
    :language: console
 
@@ -211,7 +211,7 @@ Les systèmes Unix utilisent la variable globale :term:`errno` pour résoudre ce
 
 A titre d'exemple, le programme ci-dessous utilise `strerror(3)`_ pour afficher un message d'erreur plus parlant lors d'appels erronés à la fonction `setenv(3)`_.
 
-.. literalinclude:: /C/S5-src/errno.c
+.. literalinclude:: /_static/src/C/S5-src/errno.c
    :encoding: utf-8
    :language: c
    :start-after: ///AAA
diff --git a/Theorie/C/malloc.rst b/Theorie/C/malloc.rst
index 48c535994dfe9a0e406d1b1154ad6582bc6615e0..4b87347905c3f3662f653d3456e758227ef51cc3 100644
--- a/Theorie/C/malloc.rst
+++ b/Theorie/C/malloc.rst
@@ -30,9 +30,9 @@ La première notion importante concernant la déclaration des variables est leur
 Dans un fichier donné, il ne peut évidemment pas y avoir deux variables globales qui ont le même identifiant. Lorsqu'une variable est définie dans un `bloc`, la portée de cette variable est locale à ce bloc. On parle dans ce cas de :term:`portée locale`. La variable locale n'existe pas avant le début du bloc et n'existe plus à la fin du bloc. Contrairement aux identifiants de variables globales qui doivent être uniques à l'intérieur d'un fichier, il est possible d'avoir plusieurs variables locales qui ont le même identifiant à l'intérieur d'un fichier. C'est fréquent notamment pour les définitions d'arguments de fonction et les variables de boucles. Dans l'exemple ci-dessus, les variables ``n`` et ``j`` ont une portée locale. La variable ``j`` est définie dans deux blocs différents à l'intérieur de la fonction ``f``.
 
 
-Le programme :download:`/C/S3-src/portee.c` illustre la façon dont le compilateur C gère la portée de différentes variables.
+Le programme :download:`/_static/src/C/S3-src/portee.c` illustre la façon dont le compilateur C gère la portée de différentes variables.
 
-.. literalinclude:: /C/S3-src/portee.c
+.. literalinclude:: /_static/src/C/S3-src/portee.c
    :encoding: utf-8
    :language: c
    :start-after: ///AAA
@@ -42,7 +42,7 @@ Ce programme contient deux variables qui ont une portée globale : ``g1`` et ``g
 
 Lorsqu'un identifiant de variable locale est utilisé à plusieurs endroits dans un fichier, c'est la définition la plus proche qui est utilisée. L'exécution du programme ci-dessus illustre cette utilisation des variables globales et locales.
 
-.. literalinclude:: /C/S3-src/portee.out
+.. literalinclude:: /_static/src/C/S3-src/portee.out
    :encoding: utf-8
    :language: console
 
@@ -52,7 +52,7 @@ Lorsqu'un identifiant de variable locale est utilisé à plusieurs endroits dans
 
 Les versions récentes de C [C99]_ permettent également de définir des variables dont la valeur sera constante durant toute l'exécution du programme. Ces déclarations de ces constants sont préfixées par le mot-clé ``const`` qui joue le même rôle que le mot clé ``final`` en Java.
 
-.. literalinclude:: /C/S3-src/const.c
+.. literalinclude:: /_static/src/C/S3-src/const.c
    :encoding: utf-8
    :language: c
    :start-after: ///AAA
@@ -67,7 +67,7 @@ Unions et énumérations
 
 Les structures que nous avons présentées précédemment permettent de combiner plusieurs données de types primitifs différents entre elles. Outre ces structures (``struct``), le langage C supporte également les ``enum`` et les ``union``. Le mot-clé ``enum`` est utilisé pour définir un type énuméré, c'est-à-dire un type de donnée qui permet de stocker un nombre fixe de valeurs. Quelques exemples classiques sont repris dans le fragment de programme ci-dessous :
 
-.. literalinclude:: /C/S3-src/enum.c
+.. literalinclude:: /_static/src/C/S3-src/enum.c
    :encoding: utf-8
    :language: c
    :start-after: ///AAA
@@ -75,7 +75,7 @@ Les structures que nous avons présentées précédemment permettent de combiner
 
 Le premier ``enum`` permet de définir le type de données ``day`` qui contient une valeur énumérée pour chaque jour de la semaine. L'utilisation d'un type énuméré rend le code plus lisible que simplement l'utilisation de constantes définies via le préprocesseur.
 
-.. literalinclude:: /C/S3-src/enum.c
+.. literalinclude:: /_static/src/C/S3-src/enum.c
    :encoding: utf-8
    :language: c
    :start-after: ///CCC
@@ -85,7 +85,7 @@ En pratique, lors de la définition d'un type énuméré, le compilateur C assoc
 
 Outre les structures, le langage C supporte également les unions. Alors qu'une structure permet de stocker plusieurs données dans une même zone mémoire, une ``union`` permet de réserver une zone mémoire pour stocker une données parmi plusieurs types possibles. Une ``union`` est parfois utilisée pour minimiser la quantité de mémoire utilisée pour une structure de données qui peut contenir des données de plusieurs types. Pour bien comprendre la différence entre une ``union`` et une ``struct``, considérons l'exemple ci-dessous.
 
-.. literalinclude:: /C/S3-src/union.c
+.. literalinclude:: /_static/src/C/S3-src/union.c
    :encoding: utf-8
    :language: c
    :start-after: ///AAA
@@ -94,7 +94,7 @@ Outre les structures, le langage C supporte également les unions. Alors qu'une
 
 Une union, ``u`` et une structure, ``s`` sont déclarées dans ce fragment de programme.
 
-.. literalinclude:: /C/S3-src/union.c
+.. literalinclude:: /_static/src/C/S3-src/union.c
    :encoding: utf-8
    :language: c
    :start-after: ///CCC
@@ -103,7 +103,7 @@ Une union, ``u`` et une structure, ``s`` sont déclarées dans ce fragment de pr
 La structure ``s`` peut contenir à la fois un entier et un caractère. Par contre, l'``union`` ``u``, peut elle contenir un entier (``u.i``) *ou* un caractère (``u.c``), mais jamais les deux en même temps.
 Le compilateur C alloue la taille pour l'``union`` de façon à ce qu'elle puisse contenir le type de donnée se trouvant dans l'``union`` nécessitant le plus de mémoire. Si les unions sont utiles dans certains cas très particulier, il faut faire très attention à leur utilisation. Lorsqu'une ``union`` est utilisée, le compilateur C fait encore moins de vérifications sur les types de données et le code ci-dessous est considéré comme valide par le compilateur :
 
-.. literalinclude:: /C/S3-src/union.c
+.. literalinclude:: /_static/src/C/S3-src/union.c
    :encoding: utf-8
    :language: c
    :start-after: ///EEE
@@ -111,7 +111,7 @@ Le compilateur C alloue la taille pour l'``union`` de façon à ce qu'elle puiss
 
 Lors de son exécution, la zone mémoire correspondant à l'union ``u`` sera simplement interprétée comme contenant un ``char``, même si on vient d'y stocker un entier. En pratique, lorsqu'une ``union`` est vraiment nécessaire pour des raisons d'économie de mémoire, on préférera la placer dans une ``struct`` en utilisant un type énuméré qui permet de spécifier le type de données qui est présent dans l'``union``.
 
-.. literalinclude:: /C/S3-src/union.c
+.. literalinclude:: /_static/src/C/S3-src/union.c
    :encoding: utf-8
    :language: c
    :start-after: ///BBB
@@ -119,7 +119,7 @@ Lors de son exécution, la zone mémoire correspondant à l'union ``u`` sera sim
 
 Le programmeur pourra alors utiliser cette structure en indiquant explicitement le type de données qui y est actuellement stocké comme suit.
 
-.. literalinclude:: /C/S3-src/union.c
+.. literalinclude:: /_static/src/C/S3-src/union.c
    :encoding: utf-8
    :language: c
    :start-after: ///FFF
@@ -284,7 +284,7 @@ La fonction `malloc(3)`_ prend comme argument la taille (en bytes) de la zone m
 
  Comme le langage Java, le langage C supporte des conversions implicites et explicites entre les différents types de données. Ces conversions sont possibles entre les types primitifs et les pointeurs. Nous les rencontrerons régulièrement, par exemple lorsqu'il faut récupérer un pointeur alloué par `malloc(3)`_ ou le résultat de ``sizeof``. Contrairement au compilateur Java, le compilateur C n'émet pas toujours de message de :term:`warning` lors de l'utilisation de  typecast qui risque d'engendrer une perte de précision. Ce problème est illustré par l'exemple suivant avec les nombres.
 
-  .. literalinclude:: /C/S3-src/typecast.c
+  .. literalinclude:: /_static/src/C/S3-src/typecast.c
      :encoding: utf-8
      :language: c
      :start-after: ///AAA
@@ -295,7 +295,7 @@ La fonction de la librairie `free(3)`_ est le pendant de `malloc(3)`_. Elle perm
 
 Le programme ci-dessous illustre l'utilisation de `malloc(3)`_ et `free(3)`_.
 
-.. literalinclude:: /C/S3-src/malloc.c
+.. literalinclude:: /_static/src/C/S3-src/malloc.c
    :encoding: utf-8
    :language: c
    :start-after: ///AAA
@@ -303,7 +303,7 @@ Le programme ci-dessous illustre l'utilisation de `malloc(3)`_ et `free(3)`_.
 
 Ce programme alloue trois zones mémoires. Le pointeur vers la première est sauvé dans le pointeur ``string``. Elle est destinée à contenir une chaîne de ``size`` caractères (avec un caractère supplémentaire pour stocker le caractère ``\0`` de fin de chaîne). Il y a deux points à remarquer concernant cette allocation. Tout d'abord, le pointeur retourné par `malloc(3)`_ est "casté" en un ``char *``. Cela indique au compilateur que ``string`` va bien contenir un pointeur vers une chaîne de caractères. Cette conversion explicite rend le programme plus clair. Ensuite, la valeur de retour de `malloc(3)`_  est systématiquement testée. `malloc(3)`_ peut en effet retourner ``NULL`` lorsque la mémoire est remplie. Cela a peu de chance d'arriver dans un programme de test tel que celui-ci, mais tester les valeurs de retour des fonctions de la librairie est une bonne habitude à prendre lorsque l'on programme sous Unix. Le second pointeur, ``vector`` pointe vers une zone destiné à contenir un tableau d'entiers. Le dernier pointeur, ``fract_vect`` pointe vers une zone qui pourra stocker un tableau de ``Fraction``. Lors de son exécution, le programme affiche la sortie suivante.
 
-.. literalinclude:: /C/S3-src/malloc.out
+.. literalinclude:: /_static/src/C/S3-src/malloc.out
    :encoding: utf-8
    :language: console
 
@@ -312,7 +312,7 @@ Dans cette sortie, on remarque que l'appel à fonction `free(3)`_ libère la zon
 Un autre exemple d'utilisation de `malloc(3)`_ est la fonction ``duplicate`` ci-dessous qui permet de retourner une copie d'une chaîne de caractères. Il est important de noter qu'en C la fonction `strlen(3)`_ retourne la longueur de la chaîne de caractères passée en argument sans prendre en compte le caractère ``\0`` qui marque sa fin. C'est la raison pour laquelle `malloc(3)`_ doit réserver un bloc de mémoire en plus. Même si généralement les ``char`` occupent un octet en mémoire, il est préférable d'utiliser explicitement ``sizeof(char)`` lors du calcul de l'espace mémoire nécessaire pour un type de données.
 
 
-.. literalinclude:: /C/S3-src/strcpy.c
+.. literalinclude:: /_static/src/C/S3-src/strcpy.c
    :encoding: utf-8
    :language: c
    :start-after: ///AAA
@@ -336,7 +336,7 @@ Lors de la compilation, `gcc(1)`_ affiche le :term:`warning` ``In function ‘du
 `malloc(3)`_ et `free(3)`_ sont fréquemment utilisés dans des programmes qui manipulent des structures de données dont la taille varie dans le temps. C'est le cas pour les différents sortes de listes chaînées, les piles, les queues, les arbres, ... L'exemple ci-dessous (:download:`/C/S3-src/stack.c`) illustre une implémentation d'une pile simple en C. Le pointeur vers le sommet de la pile est défini comme une variable globale. Chaque élément de la pile est représenté comme un pointeur vers une structure qui contient un pointeur vers la donnée stockée (dans cet exemple des fractions) et l'élément suivant sur la pile. Les fonctions ``push`` et ``pop`` permettent respectivement d'ajouter un élément et de retirer un élément au sommet de la pile. La fonction ``push`` alloue la mémoire nécessaire avec `malloc(3)`_ tandis que la fonction ``pop`` utilise `free(3)`_ pour libérer la mémoire dès qu'un élément est retiré.
 
 
-.. literalinclude:: /C/S3-src/stack.c
+.. literalinclude:: /_static/src/C/S3-src/stack.c
    :encoding: utf-8
    :language: c
    :start-after: ///AAA
@@ -345,7 +345,7 @@ Lors de la compilation, `gcc(1)`_ affiche le :term:`warning` ``In function ‘du
 
 Ces fonctions peuvent être utilisées pour empiler et dépiler des fractions sur une pile comme dans l'exemple ci-dessous. La fonction ``display`` permet d'afficher sur :term:`stdout` le contenu de la pile.
 
-.. literalinclude:: /C/S3-src/stack.c
+.. literalinclude:: /_static/src/C/S3-src/stack.c
    :encoding: utf-8
    :language: c
    :start-after: ///BBB
@@ -353,7 +353,7 @@ Ces fonctions peuvent être utilisées pour empiler et dépiler des fractions su
 
 Lors de son exécution le programme :download:`/C/S3-src/stack.c` présenté ci-dessus affiche les lignes suivantes sur sa sortie standard.
 
-.. literalinclude:: /C/S3-src/stack.out
+.. literalinclude:: /_static/src/C/S3-src/stack.out
    :encoding: utf-8
    :language: console
 
@@ -375,14 +375,14 @@ Le tas (ou :term:`heap`) joue un rôle très important dans les programmes C. Le
 
 `malloc(3)` est la fonction d'allocation de mémoire la plus fréquemment utilisée [#fothermalloc]_. La librairie standard contient cependant d'autres fonctions permettant d'allouer de la mémoire mais aussi de modifier des allocations antérieures. `calloc(3)`_ est nettement moins utilisée que `malloc(3)`_. Elle a pourtant un avantage majeur par rapport à `malloc(3)`_ puisqu'elle initialise à zéro la zone de mémoire allouée. `malloc(3)`_ se contente d'allouer la zone de mémoire mais n'effectue aucune initialisation. Cela permet à `malloc(3)`_ d'être plus rapide, mais le programmeur ne doit jamais oublier qu'il ne peut pas utiliser `malloc(3)`_ sans initialiser la zone mémoire allouée. Cela peut s'observer en pratique avec le programme ci-dessous. Il alloue une zone mémoire pour ``v1``, l'initialise puis la libère. Ensuite, le programme alloue une nouvelle zone mémoire pour ``v2`` et y retrouve les valeurs qu'il avait stocké pour ``v1`` précédemment. En pratique, n'importe quelle valeur pourrait se trouver dans la zone retournée par `malloc(3)`.
 
-.. literalinclude:: /C/S3-src/mallocinit.c
+.. literalinclude:: /_static/src/C/S3-src/mallocinit.c
    :encoding: utf-8
    :language: c
    :start-after: ///AAA
 
 L'exécution du programme ci-dessus affiche le résultat suivant sur la sortie standard. Ceci illustre bien que la fonction `malloc(3)`_ n'initialise pas  les zones de mémoire qu'elle alloue.
 
-.. literalinclude:: /C/S3-src/mallocinit.out
+.. literalinclude:: /_static/src/C/S3-src/mallocinit.out
    :encoding: utf-8
    :language: console
 
diff --git a/Theorie/Fichiers/fichiers.rst b/Theorie/Fichiers/fichiers.rst
index 56bc4760b3c9ea3315bea9a697b914ed27c1bd86..9b7307410a7518e8f63211b0854da82ddcd50472 100644
--- a/Theorie/Fichiers/fichiers.rst
+++ b/Theorie/Fichiers/fichiers.rst
@@ -201,7 +201,7 @@ Cette structure comprend le numéro de l'inode, c'est-à-dire la métadonnée qu
 
 L'extrait de code ci-dessous permet de lister tous les fichiers présents dans le répertoire ``name``.
 
-.. literalinclude:: /Fichiers/src/readdir.c
+.. literalinclude:: /_static/src/Fichiers/src/readdir.c
    :encoding: utf-8
    :language: c
    :start-after: ///AAA
@@ -343,7 +343,7 @@ Ces deux appels systèmes prennent trois arguments. Le premier est le `descripte
 
 Il est important de noter que `read(2)`_ et `write(2)`_ permettent de lire et d'écrire des séquences contiguës d'octets. Lorsque l'on écrit ou lit des chaînes de caractères dans lesquels chaque caractère est représenté sous la forme d'un byte, il est possible d'utiliser `read(2)`_ et `write(2)`_ pour lire et écrire d'autres types de données que des octets comme le montre l'exemple ci-dessous.
 
-.. literalinclude:: /Fichiers/src/read.c
+.. literalinclude:: /_static/src/Fichiers/src/read.c
    :encoding: utf-8
    :language: c
    :start-after: ///AAA
@@ -351,7 +351,7 @@ Il est important de noter que `read(2)`_ et `write(2)`_ permettent de lire et d'
 
 Lors de son exécution, ce programme affiche la sortie ci-dessous.
 
-.. literalinclude:: /Fichiers/src/read.out
+.. literalinclude:: /_static/src/Fichiers/src/read.out
    :encoding: utf-8
    :language: console
 
diff --git a/Theorie/Threads/coordination.rst b/Theorie/Threads/coordination.rst
index ffc441db6246cec69338b6692f82c93602c909fb..db00523beef162663e3250fc967bc2631f985e1d 100644
--- a/Theorie/Threads/coordination.rst
+++ b/Theorie/Threads/coordination.rst
@@ -110,7 +110,7 @@ Les sémaphores permettent de résoudre de nombreux problèmes classiques. Le pr
 
 Les sémaphores peuvent être utilisés pour d'autres types de synchronisation. Par exemple, considérons une application découpée en threads dans laquelle la fonction ``after`` ne peut jamais être exécutée avant la fin de l'exécution de la fonction ``before``. Ce problème de coordination peut facilement être résolu en utilisant un sémaphore qui est initialisé à la valeur ``0``. La fonction ``after`` doit démarrer par un appel à `sem_wait(3)`_ sur ce sémaphore tandis que la fonction ``before`` doit se terminer par un appel à la fonction `sem_post(3)`_ sur ce sémaphore. De cette façon, si le thread qui exécute la fonction ``after`` est trop rapide, il sera bloqué sur l'appel à `sem_wait(3)`_. S'il arrive à cette fonction après la fin de la fonction ``before`` dans l'autre thread, il pourra passer sans être bloqué. Le programme ci-dessous illustre cette utilisation des sémaphores POSIX.
 
-.. literalinclude:: /Threads/S7-src/pthread-sem-before.c
+.. literalinclude:: /_static/src/Threads/S7-src/pthread-sem-before.c
    :encoding: utf-8
    :language: c
    :start-after: ///AAA
@@ -205,46 +205,47 @@ De nombreux programmes découpés en threads fonctionnent avec un ensemble de pr
 Compléments sur les threads POSIX
 =================================
 
-.. todo: look if it is useful
-
 Il existe différentes implémentations des threads POSIX. Les mécanismes de coordination utilisables varient parfois d'une implémentation à l'autre. Dans les sections précédentes, nous nous sommes focalisés sur les fonctions principales qui sont en général bien implémentées. Une discussion plus détaillée des fonctions implémentées sous Linux peut se trouver dans [Kerrisk2010]_. [Gove2011]_ présente de façon détaillée les mécanismes de coordination utilisables sous Linux, Windows et Oracle Solaris. [StevensRago2008]_ comprend également une description des threads POSIX mais présente des exemples sur des versions plus anciennes de Linux, FreeBSD, Solaris et MacOS.
 
 Il reste cependant quelques concepts qu'il est utile de connaître lorsque l'on développe des programmes découpés en threads en langage C.
 
 
-Variables ``volatile``
-----------------------
 
-Normalement, dans un programme C, lorsqu'une variable est définie, ses accès sont contrôlés entièrement par le compilateur. Si la variable est utilisée dans plusieurs calculs successifs, il peut être utile d'un point de vue des performances de stocker la valeur de cette variable dans un registre pendant au moins le temps correspondant à l'exécution de quelques instructions [#fregister]_. Cette optimisation peut éventuellement poser des difficultés dans certains programmes utilisant des threads puisqu'une variable peut être potentiellement modifiée ou lue par plusieurs threads simultanément.
+.. Variables ``volatile``
+.. ----------------------
 
-Les premiers compilateurs C avaient pris en compte un problème similaire. Lorsqu'un programme ou un système d'exploitation interagit avec des dispositifs d'entrée-sortie, cela se fait parfois en permettant au dispositif d'écrire directement en mémoire à une adresse connue par le système d'exploitation. La valeur présente à cette adresse peut donc être modifiée par le dispositif d'entrée-sortie sans que le programme ne soit responsable de cette modification. Face à ce problème, les inventeurs du langage C ont introduit le qualificatif ``volatile``. Lorsqu'une variable est ``volatile``, cela indique au compilateur qu'il doit recharger la variable de la mémoire chaque fois qu'elle est utilisée.
+.. Normalement, dans un programme C, lorsqu'une variable est définie, ses accès sont contrôlés entièrement par le compilateur. Si la variable est utilisée dans plusieurs calculs successifs, il peut être utile d'un point de vue des performances de stocker la valeur de cette variable dans un registre pendant au moins le temps correspondant à l'exécution de quelques instructions [#fregister]_. Cette optimisation peut éventuellement poser des difficultés dans certains programmes utilisant des threads puisqu'une variable peut être potentiellement modifiée ou lue par plusieurs threads simultanément.
 
-Pour bien comprendre l'impact de ce qualificatif, il est intéressant d'analyser le code assembleur généré par un compilateur C dans l'exemple suivant.
+.. Les premiers compilateurs C avaient pris en compte un problème similaire. Lorsqu'un programme ou un système d'exploitation interagit avec des dispositifs d'entrée-sortie, cela se fait parfois en permettant au dispositif d'écrire directement en mémoire à une adresse connue par le système d'exploitation. La valeur présente à cette adresse peut donc être modifiée par le dispositif d'entrée-sortie sans que le programme ne soit responsable de cette modification. Face à ce problème, les inventeurs du langage C ont introduit le qualificatif ``volatile``. Lorsqu'une variable est ``volatile``, cela indique au compilateur qu'il doit recharger la variable de la mémoire chaque fois qu'elle est utilisée.
+
+.. Pour bien comprendre l'impact de ce qualificatif, il est intéressant d'analyser le code assembleur généré par un compilateur C dans l'exemple suivant.
 
-.. code-block:: c
 
+..
+
+.. code-block:: c
     int x=1;
     int v[2];
-
     void f(void ) {
       v[0]=x;
       v[1]=x;
     }
 
-Dans ce cas, la fonction ``f`` est traduite en la séquence d'instructions suivante :
+.. Dans ce cas, la fonction ``f`` est traduite en la séquence d'instructions suivante :
 
-.. code-block:: nasm
+..
 
+.. code-block:: nasm
    f:
- 	movl	x, %eax
+	movl	x, %eax
 	movl	%eax, v
 	movl	%eax, v+4
 	ret
+.. Si par contre la variable ``x`` est déclarée comme étant ``volatile``, le compilateur ajoute une instruction ``movl x, %eax`` qui permet de recharger la valeur de ``x`` dans un registre avant la seconde utilisation.
 
-Si par contre la variable ``x`` est déclarée comme étant ``volatile``, le compilateur ajoute une instruction ``movl x, %eax`` qui permet de recharger la valeur de ``x`` dans un registre avant la seconde utilisation.
+..
 
 .. code-block:: nasm
-
    f:
 	movl	x, %eax
 	movl	%eax, v
@@ -252,8 +253,7 @@ Si par contre la variable ``x`` est déclarée comme étant ``volatile``, le com
 	movl	%eax, v+4
 	ret
 
-Le qualificatif ``volatile`` force le compilateur à recharger la variable depuis la mémoire avant chaque utilisation. Ce qualificatif est utile lorsque le contenu stocké à une adresse mémoire peut être modifié par une autre source que le programme lui-même. C'est le cas dans les threads, mais marquer les variables partagées par des threads comme ``volatile`` ne suffit pas. Si ces variables sont modifiées par certains threads, il est nécessaire d'utiliser des :term:`mutex` ou d'autres techniques de coordination pour réguler l'accès en ces variables partagées. En pratique, la documentation du programme devra spécifier quelles variables sont partagées entre les threads et la technique de coordination éventuelle qui est utilisée pour en réguler les accès. L'utilisation du qualificatif ``volatile`` permet de forcer le compilateur à recharger le contenu de la variable depuis la mémoire avant toute utilisation. C'est une règle de bonne pratique qu'il est utile de suivre. Il faut cependant noter que dans l'exemple ci-dessus, l'utilisation du qualificatif ``volatile`` augmente le nombre d'accès à la mémoire et peut donc dans certains cas réduire les performances.
-
+.. Le qualificatif ``volatile`` force le compilateur à recharger la variable depuis la mémoire avant chaque utilisation. Ce qualificatif est utile lorsque le contenu stocké à une adresse mémoire peut être modifié par une autre source que le programme lui-même. C'est le cas dans les threads, mais marquer les variables partagées par des threads comme ``volatile`` ne suffit pas. Si ces variables sont modifiées par certains threads, il est nécessaire d'utiliser des :term:`mutex` ou d'autres techniques de coordination pour réguler l'accès en ces variables partagées. En pratique, la documentation du programme devra spécifier quelles variables sont partagées entre les threads et la technique de coordination éventuelle qui est utilisée pour en réguler les accès. L'utilisation du qualificatif ``volatile`` permet de forcer le compilateur à recharger le contenu de la variable depuis la mémoire avant toute utilisation. C'est une règle de bonne pratique qu'il est utile de suivre. Il faut cependant noter que dans l'exemple ci-dessus, l'utilisation du qualificatif ``volatile`` augmente le nombre d'accès à la mémoire et peut donc dans certains cas réduire les performances. 
 
 Variables spécifiques à un thread
 ---------------------------------
@@ -266,7 +266,7 @@ Une deuxième solution serait d'avoir un tableau global qui contiendrait des poi
 
 Pour résoudre ce problème, deux solutions sont possibles. La première combine une extension au langage C qui est supportée par `gcc(1)`_ avec la librairie threads POSIX. Il s'agit du qualificatif ``__thread`` qui peut être utilisé avant une déclaration de variable. Lorsqu'il est utilisé dans la déclaration d'une variable globale, il indique au compilateur et à la libraire POSIX qu'une copie de cette variable doit être créée pour chaque thread. Cette variable est initialisée au démarrage du thread et est utilisable uniquement à l'intérieur de ce thread. Le programme ci-dessous illustre cette utilisation du qualificatif ``__thread``.
 
-.. literalinclude:: /Threads/S7-src/pthread-specific.c
+.. literalinclude:: /_static/src/Threads/S7-src/pthread-specific.c
    :encoding: utf-8
    :language: c
    :start-after: ///AAA
@@ -274,7 +274,7 @@ Pour résoudre ce problème, deux solutions sont possibles. La première combine
 
 Lors de son exécution, ce programme affiche la sortie suivante sur :term:`stdout`. Cette sortie illustre bien que les variables dont la déclaration est précédée du qualificatif ``__thread`` sont utilisables uniquement à l'intérieur d'un thread.
 
-.. literalinclude:: /Threads/S7-src/pthread-specific.out
+.. literalinclude:: /_static/src/Threads/S7-src/pthread-specific.out
    :encoding: utf-8
    :language: console
 
@@ -291,7 +291,7 @@ Il faut noter que la fonction `pthread_key_create(3posix)`_ associe en pratique
 
 L'exemple ci-dessous illustre l'utilisation de cette API. Elle est nettement plus lourde à utiliser que le qualificatif ``__thread``. Dans ce code, chaque thread démarre par la fonction ``f``. Celle-ci crée une variable spécifique de type ``int`` qui joue le même rôle que la variable ``__thread int count;`` dans l'exemple précédent. La fonction ``g`` qui est appelée sans argument peut accéder à la zone mémoire créée en appelant ``pthread_getspecific(count)``. Elle peut ensuite exécuter ses calculs en utilisant le pointeur ``count_ptr``. Avant de se terminer, la fonction ``f`` libère la zone mémoire qui avait été allouée par `malloc(3)`_. Une alternative à l'appel explicite à `free(3)`_ aurait été de passer ``free`` comme second argument à `pthread_key_create(3posix)`_ lors de la création de la clé ``count``. En effet, ce second argument est la fonction à appeler à la fin du thread pour libérer la mémoire correspondant à cette clé.
 
-.. literalinclude:: /Threads/S7-src/pthread-specific2.c
+.. literalinclude:: /_static/src/Threads/S7-src/pthread-specific2.c
    :encoding: utf-8
    :language: c
    :start-after: ///AAA
@@ -311,7 +311,7 @@ Dans un programme séquentiel, il n'y a qu'un thread d'exécution et de nombreux
 Pour comprendre le problème, il est intéressant de comparer plusieurs implémentations d'une fonction simple. Considérons le problème de déterminer l'élément maximum d'une structure de données contenant des entiers. Si la structure de données est un tableau, une solution simple est de le parcourir entièrement pour déterminer l'élément maximum. C'est ce que fait la fonction ``max_vector`` dans le programme ci-dessous. Dans un programme purement séquentiel dans lequel le tableau peut être modifié de temps en temps, parcourir tout le tableau pour déterminer son maximum n'est pas nécessairement la solution la plus efficace. Une alternative est de mettre à jour la valeur du maximum chaque fois qu'un élément du tableau est modifié. Les fonctions ``max_global`` et ``max_static`` sont deux solutions possibles. Chacune de ces fonctions doit être appelée chaque fois qu'un élément du tableau est modifié. ``max_global`` stocke dans une variable globale la valeur actuelle du maximum du tableau et met à jour cette valeur à chaque appel. La fonction ``max_static`` fait de même en utilisant une variable statique. Ces deux solutions sont équivalentes et elles pourraient très bien être intégrées à une librairie utilisée par de nombreux programmes.
 
 
-.. literalinclude:: /Threads/S7-src/reentrant.c
+.. literalinclude:: /_static/src/Threads/S7-src/reentrant.c
    :encoding: utf-8
    :language: c
    :start-after: ///AAA
diff --git a/Theorie/Threads/threads.rst b/Theorie/Threads/threads.rst
index e50e2e41c733990ad3a5168b72bd3ad94943efc6..1e0c2a72025996059ce05d5b89fd6741c63b0e61 100644
--- a/Theorie/Threads/threads.rst
+++ b/Theorie/Threads/threads.rst
@@ -66,7 +66,12 @@ Cette progression continue des performances en MIPS a été possible grâce à l
 
 
 
-La notion de thread d'exécution est très importante dans un système informatique. Elle permet non seulement de comprendre comme un ordinateur équipé d'un seul microprocesseur peut exécuter plusieurs programmes simultanément, mais aussi comment des programmes peuvent profiter des nouveaux processeurs capables d'exécuter plusieurs threads simultanément. Pour comprendre cette notion, il est intéressant de revenir à nouveau sur l'exécution d'une fonction en langage assembleur. Considérons la fonction ``f`` :
+La notion de thread d'exécution est très importante dans un système informatique. Elle permet non seulement de comprendre comme un ordinateur équipé d'un seul microprocesseur peut exécuter plusieurs programmes simultanément, mais aussi comment des programmes peuvent profiter des nouveaux processeurs capables d'exécuter plusieurs threads simultanément.
+ 
+..
+ Pour comprendre cette notion, il est intéressant de revenir à nouveau sur l'exécution d'une fonction en langage assembleur. 
+
+Considérons la fonction ``f`` :
 
  .. code-block:: c
 
@@ -80,12 +85,12 @@ La notion de thread d'exécution est très importante dans un système informati
     return m;
   }
 
-En assembleur, cette fonction se traduit en :
+.. En assembleur, cette fonction se traduit en :
 
+..
 
 .. code-block:: nasm
-
-    f:
+	f:
 	subl	$16, %esp
 	movl	24(%esp), %eax
 	movl	20(%esp), %ecx
@@ -93,11 +98,11 @@ En assembleur, cette fonction se traduit en :
 	movl	%eax, 8(%esp)
 	movl	$0, 4(%esp)
 	movl	$0, (%esp)
-   .LBB0_1:
+	.LBB0_1:
 	movl	(%esp), %eax
 	cmpl	8(%esp), %eax
 	jge	.LBB0_3
-
+..
 	movl	12(%esp), %eax
 	movl	4(%esp), %ecx
 	addl	%eax, %ecx
@@ -106,23 +111,28 @@ En assembleur, cette fonction se traduit en :
 	addl	$1, %eax
 	movl	%eax, (%esp)
 	jmp	.LBB0_1
-   .LBB0_3:
+	.LBB0_3:
 	movl	4(%esp), %eax
 	addl	$16, %esp
 	ret
 
 
-Pour qu'un processeur puisse exécuter cette séquence d'instructions, il faut non seulement qu'il implémente chacune de ces instructions, mais également qu'il puisse accéder :
+Pour qu'un processeur puisse exécuter cette séquence d'instructions, il faut qu'il puisse accéder :
+.. il faut non seulement qu'il implémente chacune de ces instructions, mais également qu'il puisse accéder :
 
  - à la mémoire contenant les instructions à exécuter
  - à la mémoire contenant les données manipulées par cette séquence d'instruction. Pour rappel, cette mémoire est divisée en plusieurs parties :
 
     - la zone contenant les variables globales
-    - le tas
+    - le tas 
     - la pile
 
- - aux registres et plus particulièrement, il doit accéder :
 
+ - aux registres, des zone de mémoire très rapide (mais peu nombreuses par soucis technique) se trouvant sur le processeur qui permettent de stocker entre autre : l'addresse de l'instruction à exécuter, des résultats intermédaires obtenus durant l'exécution d'un instruction ou encore des informations sur la pile.
+
+
+.. et plus particulièrement, il doit accéder :
+..
     - aux registres de données pour stocker les résultats de chacune des instructions
     - au registre ``%esp`` directement ou indirectement via les instructions ``push`` et ``pop`` qui permettent de manipuler la pile
     - au registre ``%eip`` qui contient l'adresse de l'instruction en cours d'exécution
@@ -186,7 +196,7 @@ Le premier argument de `pthread_join(3)`_ est la structure ``pthread_t`` corresp
 
 L'exemple ci-dessous illustre une utilisation simple des fonctions `pthread_create(3)`_, `pthread_join(3)`_ et `pthread_exit(3)`_.
 
-.. literalinclude:: /Threads/S5-src/pthread.c
+.. literalinclude:: /_static/src/Threads/S5-src/pthread.c
    :encoding: utf-8
    :language: c
    :start-after: ///AAA
@@ -195,7 +205,7 @@ Dans ce programme, la fonction ``main`` lance deux threads. Le premier exécute
 
 Afin d'illustrer la possibilité de passer des arguments à un thread et d'en récupérer la valeur de retour, considérons l'exemple ci-dessous.
 
-.. literalinclude:: /Threads/S5-src/pthread-neg.c
+.. literalinclude:: /_static/src/Threads/S5-src/pthread-neg.c
    :encoding: utf-8
    :language: c
    :start-after: ///AAA
diff --git a/Theorie/Threads/threads2.rst b/Theorie/Threads/threads2.rst
index 027c5e6a03e5fb86cd0a9e928c966e9cfd1837a2..618677f5c0004b8d2c14cf82a2c310f2c07a35a3 100644
--- a/Theorie/Threads/threads2.rst
+++ b/Theorie/Threads/threads2.rst
@@ -84,7 +84,7 @@ Malheureusement les difficultés surviennent lorsque deux threads exécutent en
 
  La taille de la pile d'un thread POSIX est l'un des attributs qui peuvent être modifiés lors de l'appel à `pthread_create(3)`_  pour créer un nouveau thread. Cet attribut peut être fixé en utilisant la fonction `pthread_attr_setstackaddr(3posix)`_ comme illustré dans l'exemple ci-dessous [#fpthreadc]_ (où ``thread_first`` est la fonction qui sera appelée à la création du thread). En général, la valeur par défaut choisie par le système suffit, sauf lorsque le programmeur sait qu'un thread devra par exemple allouer un grand tableau auquel il sera le seul à avoir accès. Ce tableau sera alors alloué sur la pile qui devra être suffisamment grande pour le contenir.
 
- .. literalinclude:: /Threads/S6-src/pthread.c
+ .. literalinclude:: /_static/src/Threads/S6-src/pthread.c
     :encoding: utf-8
     :language: c
     :start-after: ///AAA
@@ -95,7 +95,7 @@ Ce problème d'accès concurrent à une zone de mémoire par plusieurs threads e
 
 Le fragment de code ci-dessus présente une autre illustration d'une section critique. Dans cet exemple, la fonction ``main`` (non présentée), créée deux threads. Le premier exécute la fonction ``inc`` qui incrémente la variable ``global``. Le second exécute la fonction ``is_even`` qui teste la valeur de cette variable et compte le nombre de fois qu'elle est paire. Après la terminaison des deux threads, le programme affiche le contenu des variables ``global`` et ``even``.
 
-.. literalinclude:: /Threads/S6-src/pthread-test-if.c
+.. literalinclude:: /_static/src/Threads/S6-src/pthread-test-if.c
    :encoding: utf-8
    :language: c
    :start-after: ///AAA
@@ -274,7 +274,7 @@ En C, cela se fait en utilisant les fonctions `pthread_mutex_lock(3posix)`_ et `
 
 L'exemple ci-dessous reprend le programme dans lequel une variable globale est incrémentée par plusieurs threads.
 
-.. literalinclude:: /Threads/S6-src/pthread-mutex.c
+.. literalinclude:: /_static/src/Threads/S6-src/pthread-mutex.c
    :encoding: utf-8
    :language: c
    :start-after: ///AAA
@@ -303,9 +303,9 @@ Pour montrer que la propriété de vivacité est bien respectée, il faut montre
 
 .. rubric:: Footnotes
 
-.. [#fexemple] Le programme complet est accessible via :download:`/Threads/S5-src/pthread-test.c`
+.. [#fexemple] Le programme complet est accessible via :download:`/_static/src/Threads/S5-src/pthread-test.c`
 
-.. [#fpthreadc] Le programme complet est accessible via :download:`/Threads/S6-src/pthread.c`
+.. [#fpthreadc] Le programme complet est accessible via :download:`/_static/src/Threads/S6-src/pthread.c`
 
 .. .. [#fframes] Il existe différents standards pour le nombre d'images par seconde en cinéma et en télévision. Les plus courants sont 24, 25 et 30 images par seconde. Voir http://en.wikipedia.org/wiki/Frame_rate
 
@@ -317,4 +317,4 @@ Pour montrer que la propriété de vivacité est bien respectée, il faut montre
 
 .. [#fstaticinit] Linux supporte également la macro ``PTHREAD_MUTEX_INITIALIZER`` qui permet d'initialiser directement un ``pthread_mutex_t`` déclaré comme variable globale. Dans cet exemple, la déclaration aurait été : ``pthread_mutex_t global_mutex=PTHREAD_MUTEX_INITIALIZER;`` et l'appel à `pthread_mutex_init(3posix)`_ aurait été inutile. Comme il s'agit d'une extension spécifique à Linux, il est préférable de ne pas l'utiliser pour garantir la portabilité du code.
 
-.. [#fphilo] Le programme complet est :download:`/Threads/S6-src/pthread-philo.c`
+.. [#fphilo] Le programme complet est :download:`/_static/src/Threads/S6-src/pthread-philo.c`
diff --git a/_static/Mission-9-qcm.html b/_static/Mission-9-qcm.html
new file mode 100644
index 0000000000000000000000000000000000000000..f949d73163d8b8b6fed9be4e8a2fe0042fd9e433
--- /dev/null
+++ b/_static/Mission-9-qcm.html
@@ -0,0 +1,989 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<meta name="generator" content="Docutils 0.15.2: http://docutils.sourceforge.net/" />
+<title>Neuvième semaine</title>
+<style type="text/css">
+
+/*
+:Author: David Goodger (goodger@python.org)
+:Id: $Id: html4css1.css 7056 2011-06-17 10:50:48Z milde $
+:Copyright: This stylesheet has been placed in the public domain.
+
+Default cascading style sheet for the HTML output of Docutils.
+
+See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
+customize this style sheet.
+*/
+
+/* used to remove borders from tables and images */
+.borderless, table.borderless td, table.borderless th {
+  border: 0 }
+
+table.borderless td, table.borderless th {
+  /* Override padding for "table.docutils td" with "! important".
+     The right padding separates the table cells. */
+  padding: 0 0.5em 0 0 ! important }
+
+.first {
+  /* Override more specific margin styles with "! important". */
+  margin-top: 0 ! important }
+
+.last, .with-subtitle {
+  margin-bottom: 0 ! important }
+
+.hidden {
+  display: none }
+
+a.toc-backref {
+  text-decoration: none ;
+  color: black }
+
+blockquote.epigraph {
+  margin: 2em 5em ; }
+
+dl.docutils dd {
+  margin-bottom: 0.5em }
+
+object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
+  overflow: hidden;
+}
+
+/* Uncomment (and remove this text!) to get bold-faced definition list terms
+dl.docutils dt {
+  font-weight: bold }
+*/
+
+div.abstract {
+  margin: 2em 5em }
+
+div.abstract p.topic-title {
+  font-weight: bold ;
+  text-align: center }
+
+div.admonition, div.attention, div.caution, div.danger, div.error,
+div.hint, div.important, div.note, div.tip, div.warning {
+  margin: 2em ;
+  border: medium outset ;
+  padding: 1em }
+
+div.admonition p.admonition-title, div.hint p.admonition-title,
+div.important p.admonition-title, div.note p.admonition-title,
+div.tip p.admonition-title {
+  font-weight: bold ;
+  font-family: sans-serif }
+
+div.attention p.admonition-title, div.caution p.admonition-title,
+div.danger p.admonition-title, div.error p.admonition-title,
+div.warning p.admonition-title {
+  color: red ;
+  font-weight: bold ;
+  font-family: sans-serif }
+
+/* Uncomment (and remove this text!) to get reduced vertical space in
+   compound paragraphs.
+div.compound .compound-first, div.compound .compound-middle {
+  margin-bottom: 0.5em }
+
+div.compound .compound-last, div.compound .compound-middle {
+  margin-top: 0.5em }
+*/
+
+div.dedication {
+  margin: 2em 5em ;
+  text-align: center ;
+  font-style: italic }
+
+div.dedication p.topic-title {
+  font-weight: bold ;
+  font-style: normal }
+
+div.figure {
+  margin-left: 2em ;
+  margin-right: 2em }
+
+div.footer, div.header {
+  clear: both;
+  font-size: smaller }
+
+div.line-block {
+  display: block ;
+  margin-top: 1em ;
+  margin-bottom: 1em }
+
+div.line-block div.line-block {
+  margin-top: 0 ;
+  margin-bottom: 0 ;
+  margin-left: 1.5em }
+
+div.sidebar {
+  margin: 0 0 0.5em 1em ;
+  border: medium outset ;
+  padding: 1em ;
+  background-color: #ffffee ;
+  width: 40% ;
+  float: right ;
+  clear: right }
+
+div.sidebar p.rubric {
+  font-family: sans-serif ;
+  font-size: medium }
+
+div.system-messages {
+  margin: 5em }
+
+div.system-messages h1 {
+  color: red }
+
+div.system-message {
+  border: medium outset ;
+  padding: 1em }
+
+div.system-message p.system-message-title {
+  color: red ;
+  font-weight: bold }
+
+div.topic {
+  margin: 2em }
+
+h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
+h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
+  margin-top: 0.4em }
+
+h1.title {
+  text-align: center }
+
+h2.subtitle {
+  text-align: center }
+
+hr.docutils {
+  width: 75% }
+
+img.align-left, .figure.align-left, object.align-left {
+  clear: left ;
+  float: left ;
+  margin-right: 1em }
+
+img.align-right, .figure.align-right, object.align-right {
+  clear: right ;
+  float: right ;
+  margin-left: 1em }
+
+img.align-center, .figure.align-center, object.align-center {
+  display: block;
+  margin-left: auto;
+  margin-right: auto;
+}
+
+.align-left {
+  text-align: left }
+
+.align-center {
+  clear: both ;
+  text-align: center }
+
+.align-right {
+  text-align: right }
+
+/* reset inner alignment in figures */
+div.align-right {
+  text-align: inherit }
+
+/* div.align-center * { */
+/*   text-align: left } */
+
+ol.simple, ul.simple {
+  margin-bottom: 1em }
+
+ol.arabic {
+  list-style: decimal }
+
+ol.loweralpha {
+  list-style: lower-alpha }
+
+ol.upperalpha {
+  list-style: upper-alpha }
+
+ol.lowerroman {
+  list-style: lower-roman }
+
+ol.upperroman {
+  list-style: upper-roman }
+
+p.attribution {
+  text-align: right ;
+  margin-left: 50% }
+
+p.caption {
+  font-style: italic }
+
+p.credits {
+  font-style: italic ;
+  font-size: smaller }
+
+p.label {
+  white-space: nowrap }
+
+p.rubric {
+  font-weight: bold ;
+  font-size: larger ;
+  color: maroon ;
+  text-align: center }
+
+p.sidebar-title {
+  font-family: sans-serif ;
+  font-weight: bold ;
+  font-size: larger }
+
+p.sidebar-subtitle {
+  font-family: sans-serif ;
+  font-weight: bold }
+
+p.topic-title {
+  font-weight: bold }
+
+pre.address {
+  margin-bottom: 0 ;
+  margin-top: 0 ;
+  font: inherit }
+
+pre.literal-block, pre.doctest-block, pre.math {
+  margin-left: 2em ;
+  margin-right: 2em }
+
+span.classifier {
+  font-family: sans-serif ;
+  font-style: oblique }
+
+span.classifier-delimiter {
+  font-family: sans-serif ;
+  font-weight: bold }
+
+span.interpreted {
+  font-family: sans-serif }
+
+span.option {
+  white-space: nowrap }
+
+span.pre {
+  white-space: pre }
+
+span.problematic {
+  color: red }
+
+span.section-subtitle {
+  /* font-size relative to parent (h1..h6 element) */
+  font-size: 80% }
+
+table.citation {
+  border-left: solid 1px gray;
+  margin-left: 1px }
+
+table.docinfo {
+  margin: 2em 4em }
+
+table.docutils {
+  margin-top: 0.5em ;
+  margin-bottom: 0.5em }
+
+table.footnote {
+  border-left: solid 1px black;
+  margin-left: 1px }
+
+table.docutils td, table.docutils th,
+table.docinfo td, table.docinfo th {
+  padding-left: 0.5em ;
+  padding-right: 0.5em ;
+  vertical-align: top }
+
+table.docutils th.field-name, table.docinfo th.docinfo-name {
+  font-weight: bold ;
+  text-align: left ;
+  white-space: nowrap ;
+  padding-left: 0 }
+
+h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
+h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
+  font-size: 100% }
+
+ul.auto-toc {
+  list-style-type: none }
+
+</style>
+<style type="text/css">
+
+/*
+:Author: 3.14r
+:Contact: 3@14r.com
+:Copyright: This stylesheet has been placed in the public domain.
+
+Stylesheet for use with Docutils.
+
+*/
+
+/* @import url(html4css1.css); */
+
+
+/* Your customizations go here.  For example: */
+
+body {
+    padding: 2% 5% 0 5%;
+}
+
+h1, h2, h3 {
+    background-color: #2c5aa0;
+    padding: 3px 0 3px 40px;
+    color: white;
+    border-radius: 10px 0 0 10px;
+    -moz-border-radius: 10px 0 0 10px;
+    -webkit-border-radius: 10px 0 0 10px;
+    font-size: 150%;
+}
+h1.title {
+    text-align: left;
+}
+
+div.section {
+    margin-top: 35px;
+    margin-bottom: 10px;
+}
+
+.checker>h1, div.section>h1 {
+    font-size: 100%;
+}
+
+li p.first {
+    display: inline;
+}
+
+li>img.checkmark {
+    margin-left: -50px;
+}
+
+ul {
+    list-style-type: none;
+}
+
+input[type=radio] {
+    margin-right: 15px;
+    vertical-align: center;
+}
+
+.result {
+    display: inline;
+    margin-left: 30px;
+    font-weight: bold;
+}
+
+</style>
+<style type="text/css">
+
+.highlight .hll { background-color: #ffffcc }
+.highlight  { background: #f8f8f8; }
+.highlight .c { color: #408080; font-style: italic } /* Comment */
+.highlight .err { border: 1px solid #FF0000 } /* Error */
+.highlight .k { color: #008000; font-weight: bold } /* Keyword */
+.highlight .o { color: #666666 } /* Operator */
+.highlight .cm { color: #408080; font-style: italic } /* Comment.Multiline */
+.highlight .cp { color: #BC7A00 } /* Comment.Preproc */
+.highlight .c1 { color: #408080; font-style: italic } /* Comment.Single */
+.highlight .cs { color: #408080; font-style: italic } /* Comment.Special */
+.highlight .gd { color: #A00000 } /* Generic.Deleted */
+.highlight .ge { font-style: italic } /* Generic.Emph */
+.highlight .gr { color: #FF0000 } /* Generic.Error */
+.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */
+.highlight .gi { color: #00A000 } /* Generic.Inserted */
+.highlight .go { color: #808080 } /* Generic.Output */
+.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */
+.highlight .gs { font-weight: bold } /* Generic.Strong */
+.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
+.highlight .gt { color: #0040D0 } /* Generic.Traceback */
+.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */
+.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */
+.highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */
+.highlight .kp { color: #008000 } /* Keyword.Pseudo */
+.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */
+.highlight .kt { color: #B00040 } /* Keyword.Type */
+.highlight .m { color: #666666 } /* Literal.Number */
+.highlight .s { color: #BA2121 } /* Literal.String */
+.highlight .na { color: #7D9029 } /* Name.Attribute */
+.highlight .nb { color: #008000 } /* Name.Builtin */
+.highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */
+.highlight .no { color: #880000 } /* Name.Constant */
+.highlight .nd { color: #AA22FF } /* Name.Decorator */
+.highlight .ni { color: #999999; font-weight: bold } /* Name.Entity */
+.highlight .ne { color: #D2413A; font-weight: bold } /* Name.Exception */
+.highlight .nf { color: #0000FF } /* Name.Function */
+.highlight .nl { color: #A0A000 } /* Name.Label */
+.highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */
+.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */
+.highlight .nv { color: #19177C } /* Name.Variable */
+.highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */
+.highlight .w { color: #bbbbbb } /* Text.Whitespace */
+.highlight .mf { color: #666666 } /* Literal.Number.Float */
+.highlight .mh { color: #666666 } /* Literal.Number.Hex */
+.highlight .mi { color: #666666 } /* Literal.Number.Integer */
+.highlight .mo { color: #666666 } /* Literal.Number.Oct */
+.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */
+.highlight .sc { color: #BA2121 } /* Literal.String.Char */
+.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */
+.highlight .s2 { color: #BA2121 } /* Literal.String.Double */
+.highlight .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */
+.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */
+.highlight .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */
+.highlight .sx { color: #008000 } /* Literal.String.Other */
+.highlight .sr { color: #BB6688 } /* Literal.String.Regex */
+.highlight .s1 { color: #BA2121 } /* Literal.String.Single */
+.highlight .ss { color: #19177C } /* Literal.String.Symbol */
+.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */
+.highlight .vc { color: #19177C } /* Name.Variable.Class */
+.highlight .vg { color: #19177C } /* Name.Variable.Global */
+.highlight .vi { color: #19177C } /* Name.Variable.Instance */
+.highlight .il { color: #666666 } /* Literal.Number.Integer.Long */
+
+</style>
+</head>
+<body>
+<div class="document" id="neuvieme-semaine">
+<h1 class="title">Neuvième semaine</h1>
+
+<!-- -*- coding: utf-8 -*- -->
+<!-- Copyright |copy| 2012 by `Olivier Bonaventure <http://inl.info.ucl.ac.be/obo>`_, Christoph Paasch et Grégory Detal -->
+<!-- Ce fichier est distribué sous une licence `creative commons <http://creativecommons.org/licenses/by-sa/3.0/>`_ -->
+<script type="text/javascript" src="js/jquery-1.7.2.min.js"></script>
+<script type="text/javascript" src="js/jquery-shuffle.js"></script>
+<script type="text/javascript" src="js/rst-form.js"></script>
+<script type="text/javascript" src="js/prettify.js"></script>
+<script type="text/javascript">$nmbr_prop = 4</script><p>La matière couverte cette semaine porte sur le système de fichiers et sa manipulation par les processus.</p>
+<div class="section" id="question-1-acces-aux-fichiers">
+<h1>Question 1. Accès aux fichiers</h1>
+<p>Les bits de permissions permettent de contrôler l'accès aux fichiers. Considérons le répertoire ci-dessous :</p>
+<div class="system-message">
+<p class="system-message-title">System Message: WARNING/2 (<tt class="docutils">qcm-9.rst</tt>, line 26)</p>
+<p>Cannot analyze code. Pygments package not found.</p>
+<pre class="literal-block">
+.. code-block:: console
+
+  -rw-r--r--  1 obo  obo   0 23 mar 21:57 a
+  -r-xr-x--x  1 obo  obo   0 23 mar 21:57 b
+  -rw-------  1 obo  obo   0 23 mar 21:57 c
+  -rw------x  1 obo  obo   0 23 mar 21:57 d
+  --w-----w-  1 obo  obo   0 23 mar 21:57 e
+
+
+</pre>
+</div>
+<p>Un seul des groupes d'affirmations ci-dessous est vrai. Lequel ?</p>
+<ul class="positive simple">
+<li><ul class="first">
+<li>l'utilisateur <tt class="docutils literal">obo</tt> peut lire le fichier <tt class="docutils literal">c</tt>, exécuter le fichier <tt class="docutils literal">b</tt> et modifier le contenu du fichier <tt class="docutils literal">d</tt></li>
+</ul>
+</li>
+<li><ul class="first">
+<li>l'utilisateur <tt class="docutils literal">obo</tt> peut lire le fichier <tt class="docutils literal">a</tt>, exécuter le fichier <tt class="docutils literal">b</tt> et modifier le contenu du fichier <tt class="docutils literal">c</tt></li>
+</ul>
+</li>
+</ul>
+<ul class="negative">
+<li><ul class="first">
+<li><p class="first">l'utilisateur <tt class="docutils literal">obo</tt> peut lire le fichier <tt class="docutils literal">e</tt>, exécuter le fichier <tt class="docutils literal">b</tt> et modifier le contenu du fichier <tt class="docutils literal">e</tt></p>
+<p class="comment">Le fichier <tt class="docutils literal">e</tt> n'est pas lisible par cet utilisateur.</p>
+</li>
+</ul>
+</li>
+<li><ul class="first">
+<li><p class="first">l'utilisateur <tt class="docutils literal">obo</tt> peut lire le fichier <tt class="docutils literal">c</tt>, exécuter le fichier <tt class="docutils literal">d</tt> et modifier le contenu du fichier <tt class="docutils literal">b</tt></p>
+<p class="comment">Le fichier <tt class="docutils literal">b</tt> n'est pas modifiable par cet utilisateur.</p>
+</li>
+</ul>
+</li>
+<li><ul class="first">
+<li><p class="first">l'utilisateur <tt class="docutils literal">obo</tt> peut lire le fichier <tt class="docutils literal">c</tt>, exécuter le fichier <tt class="docutils literal">a</tt> et modifier le contenu du fichier <tt class="docutils literal">d</tt></p>
+<p class="comment">Le fichier <tt class="docutils literal">a</tt> n'est pas exécutable par cet utilisateur.</p>
+</li>
+</ul>
+</li>
+</ul>
+</div>
+<div class="section" id="question-2-fichiers-et-repertoires">
+<h1>Question 2. Fichiers et répertoires</h1>
+<p>Les permissions associées aux répertoires ont un rôle un peu différent de celles qui sont associées aux fichiers. Considérons le répertoire ci-dessous qui contient 4 sous-répertoires.</p>
+<div class="system-message">
+<p class="system-message-title">System Message: WARNING/2 (<tt class="docutils">qcm-9.rst</tt>, line 76)</p>
+<p>Cannot analyze code. Pygments package not found.</p>
+<pre class="literal-block">
+.. code-block:: console
+
+   drw-------  2 obo  obo   68 23 mar 22:25 a
+   dr-x------  2 obo  obo   68 23 mar 22:25 b
+   d-wx------  3 obo  obo  102 23 mar 22:27 c
+   drwx------  3 obo  obo  102 23 mar 22:26 d
+
+</pre>
+</div>
+<p>Chacun de ces répertoires contient un fichier qui a comme nom <tt class="docutils literal">f</tt>. La commande <a class="reference external" href="http://sites.uclouvain.be/SystInfo/manpages/man1/touch.1.html">touch(1)</a> peut être utilisée pour créer un fichier vide. Ainsi, dans ce répertoire, la commande <tt class="docutils literal">touch f</tt> va créer le fichier  <tt class="docutils literal">f</tt></p>
+<div class="system-message">
+<p class="system-message-title">System Message: WARNING/2 (<tt class="docutils">qcm-9.rst</tt>, line 85)</p>
+<p>Cannot analyze code. Pygments package not found.</p>
+<pre class="literal-block">
+.. code-block:: console
+
+   ls -l f
+   -rw-r--r--  1 obo  obo  0 23 mar 22:30 f
+
+</pre>
+</div>
+<p>Dans le répertoire ci-dessus, une seule séquence de commandes fonctionne sans erreur. Laquelle ?</p>
+<ul class="positive">
+<li><div class="first system-message">
+<p class="system-message-title">System Message: WARNING/2 (<tt class="docutils">qcm-9.rst</tt>, line 95)</p>
+<p>Cannot analyze code. Pygments package not found.</p>
+<pre class="literal-block">
+.. code-block:: console
+
+   ls -l d
+   touch c/x
+   cd b
+
+</pre>
+</div>
+</li>
+<li><div class="first system-message">
+<p class="system-message-title">System Message: WARNING/2 (<tt class="docutils">qcm-9.rst</tt>, line 102)</p>
+<p>Cannot analyze code. Pygments package not found.</p>
+<pre class="literal-block">
+.. code-block:: console
+
+   ls -l b
+   cat c/f
+   cd d
+
+
+</pre>
+</div>
+</li>
+</ul>
+<ul class="negative">
+<li><div class="first system-message">
+<p class="system-message-title">System Message: WARNING/2 (<tt class="docutils">qcm-9.rst</tt>, line 112)</p>
+<p>Cannot analyze code. Pygments package not found.</p>
+<pre class="literal-block">
+.. code-block:: console
+
+   ls -l c
+   touch d/x
+   cd a
+
+</pre>
+</div>
+<p class="comment">Il n'est pas possible d'aller dans le répertoire <tt class="docutils literal">a</tt>. En outre, le contenu du répertoire <tt class="docutils literal">c</tt> ne peut pas être lu avec <a class="reference external" href="http://sites.uclouvain.be/SystInfo/manpages/man1/ls.1.html">ls(1)</a></p>
+</li>
+<li><div class="first system-message">
+<p class="system-message-title">System Message: WARNING/2 (<tt class="docutils">qcm-9.rst</tt>, line 123)</p>
+<p>Cannot analyze code. Pygments package not found.</p>
+<pre class="literal-block">
+.. code-block:: console
+
+   ls -l c
+   touch a/x
+   cd c
+
+</pre>
+</div>
+<p class="comment">Il n'est pas possible de créer un fichier dans le répertoire <tt class="docutils literal">a</tt>.</p>
+</li>
+<li><div class="first system-message">
+<p class="system-message-title">System Message: WARNING/2 (<tt class="docutils">qcm-9.rst</tt>, line 134)</p>
+<p>Cannot analyze code. Pygments package not found.</p>
+<pre class="literal-block">
+.. code-block:: console
+
+   ls -l b
+   touch b/x
+   cd b
+
+</pre>
+</div>
+<p class="comment">Il n'est pas possible de créer un fichier dans le répertoire <tt class="docutils literal">b</tt>.</p>
+</li>
+</ul>
+</div>
+<div class="section" id="question-3-permissions-sur-les-fichiers">
+<h1>Question 3. Permissions sur les fichiers</h1>
+<p>La page de manuel de <a class="reference external" href="http://sites.uclouvain.be/SystInfo/manpages/man1/chmod.1posix.html">chmod(1posix)</a> décrit en détails les permissions relatives aux fichiers et répertoires. Ces permissions peuvent être représentées sous une forme numérique ou textuelle. Parmi les affirmations suivantes, relatives à des permissions pour des <cite>fichiers</cite>, un seul groupe est vrai. Lequel ?</p>
+<ul class="positive simple">
+<li><ul class="first">
+<li>Le fichier ayant <tt class="docutils literal">00467</tt> comme permissions est exécutable par n'importe quel utilisateur</li>
+<li>Le fichier ayant <tt class="docutils literal">00777</tt> comme permissions est lisible par son propriétaire</li>
+<li>Le fichier ayant <tt class="docutils literal">00600</tt> ne peut être lu que par son propriétaire</li>
+</ul>
+</li>
+<li><ul class="first">
+<li>Le fichier ayant <tt class="docutils literal">00647</tt> comme permissions est exécutable par n'importe quel utilisateur</li>
+<li>Le fichier ayant <tt class="docutils literal">00700</tt> comme permissions est lisible par son propriétaire</li>
+<li>Le fichier ayant <tt class="docutils literal">00421</tt> comme permissions ne peut être lu que par son propriétaire</li>
+</ul>
+</li>
+</ul>
+<ul class="negative">
+<li><ul class="first simple">
+<li>Le fichier ayant <tt class="docutils literal">00476</tt> comme permissions est exécutable par n'importe quel utilisateur</li>
+<li>Le fichier ayant <tt class="docutils literal">00747</tt> comme permissions est lisible par son propriétaire</li>
+<li>Le fichier ayant <tt class="docutils literal">00601</tt> comme permissions ne peut être lu que par son propriétaire</li>
+</ul>
+<p class="comment">Le fichier ayant <tt class="docutils literal">00476</tt> comme permissions ne peut être exécuté que par un membre du groupe correspondant à ce fichier.</p>
+</li>
+<li><ul class="first simple">
+<li>Le fichier ayant <tt class="docutils literal">00677</tt> comme permissions est exécutable par n'importe quel utilisateur</li>
+<li>Le fichier ayant <tt class="docutils literal">00017</tt> comme permissions est lisible par son propriétaire</li>
+<li>Le fichier ayant <tt class="docutils literal">00400</tt> comme permissions ne peut être lu que par son propriétaire</li>
+</ul>
+<p class="comment">Le fichier ayant <tt class="docutils literal">00017</tt> comme permissions n'est pas lisible par son propriétaire</p>
+</li>
+<li><ul class="first simple">
+<li>Le fichier ayant <tt class="docutils literal">00755</tt> comme permissions est exécutable par n'importe quel utilisateur</li>
+<li>Le fichier ayant <tt class="docutils literal">00417</tt> comme permissions est lisible par son propriétaire</li>
+<li>Le fichier ayant <tt class="docutils literal">00222</tt> comme permissions ne peut être lu que par son propriétaire</li>
+</ul>
+<p class="comment">Le fichier ayant <tt class="docutils literal">00222</tt> comme permissions n'est pas lisible par son propriétaire</p>
+</li>
+<li><ul class="first simple">
+<li>Le fichier ayant <tt class="docutils literal">00666</tt> comme permissions est exécutable par n'importe quel utilisateur</li>
+<li>Le fichier ayant <tt class="docutils literal">00400</tt> comme permissions est modificale par son propriétaire</li>
+<li>Le fichier ayant <tt class="docutils literal">00400</tt> comme permissions ne peut être lu que par son propriétaire</li>
+</ul>
+<p class="comment">Le fichier ayant <tt class="docutils literal">00666</tt> comme permissions n'est pas exécutable</p>
+</li>
+</ul>
+</div>
+<div class="section" id="question-4-permissions-sur-les-fichiers">
+<h1>Question 4. Permissions sur les fichiers</h1>
+<p>Les bits de permissions associés à un fichiers sont généralement représentés sous forme textuelle lorsque la commande <a class="reference external" href="http://sites.uclouvain.be/SystInfo/manpages/man1/ls.1.html">ls(1)</a> affiche le contenu d'un répertoire. Considérons le répertoire ci-dessous :</p>
+<blockquote>
+<div class="system-message">
+<p class="system-message-title">System Message: WARNING/2 (<tt class="docutils">qcm-9.rst</tt>, line 211)</p>
+<p>Cannot analyze code. Pygments package not found.</p>
+<pre class="literal-block">
+.. code-block:: console
+
+  -rw-r--r--  1 obo  obo  0 23 mar 21:57 a
+  -rwxr-x--x  1 obo  obo  0 23 mar 21:57 b
+  -rw-------  1 obo  obo  0 23 mar 21:57 c
+  -rw------x  1 obo  obo  0 23 mar 21:57 d
+  --w-r--rw-  1 obo  obo  0 23 mar 21:57 e
+
+
+</pre>
+</div>
+</blockquote>
+<p>Parmi les commandes suivantes, un seul groupe permet d'obtenir les mêmes permissions que ci-dessous. Lequel ?</p>
+<ul class="positive">
+<li><div class="first system-message">
+<p class="system-message-title">System Message: WARNING/2 (<tt class="docutils">qcm-9.rst</tt>, line 225)</p>
+<p>Cannot analyze code. Pygments package not found.</p>
+<pre class="literal-block">
+.. code-block:: console
+
+   chmod 644 a
+   chmod 751 b
+   chmod 600 c
+   chmod 601 d
+   chmod 246 e
+
+</pre>
+</div>
+</li>
+</ul>
+<ul class="negative">
+<li><div class="first system-message">
+<p class="system-message-title">System Message: WARNING/2 (<tt class="docutils">qcm-9.rst</tt>, line 237)</p>
+<p>Cannot analyze code. Pygments package not found.</p>
+<pre class="literal-block">
+.. code-block:: console
+
+   chmod 446 a
+   chmod 157 b
+   chmod 006 c
+   chmod 106 d
+   chmod 642 e
+
+</pre>
+</div>
+<p class="comment">Relisez la page de manuel de <a class="reference external" href="http://sites.uclouvain.be/SystInfo/manpages/man1/chmod.1.html">chmod(1)</a></p>
+</li>
+<li><div class="first system-message">
+<p class="system-message-title">System Message: WARNING/2 (<tt class="docutils">qcm-9.rst</tt>, line 250)</p>
+<p>Cannot analyze code. Pygments package not found.</p>
+<pre class="literal-block">
+.. code-block:: console
+
+   chmod 444 a
+   chmod 751 b
+   chmod 600 c
+   chmod 604 d
+   chmod 123 e
+
+</pre>
+</div>
+<p class="comment">Relisez la page de manuel de <a class="reference external" href="http://sites.uclouvain.be/SystInfo/manpages/man1/chmod.1.html">chmod(1)</a></p>
+</li>
+<li><div class="first system-message">
+<p class="system-message-title">System Message: WARNING/2 (<tt class="docutils">qcm-9.rst</tt>, line 263)</p>
+<p>Cannot analyze code. Pygments package not found.</p>
+<pre class="literal-block">
+.. code-block:: console
+
+   chmod 322 a
+   chmod 364 b
+   chmod 300 c
+   chmod 301 d
+   chmod 123 e
+
+</pre>
+</div>
+<p class="comment">Relisez la page de manuel de <a class="reference external" href="http://sites.uclouvain.be/SystInfo/manpages/man1/chmod.1.html">chmod(1)</a></p>
+</li>
+</ul>
+</div>
+<div class="section" id="question-5-systeme-de-fichiers">
+<h1>Question 5. Système de fichiers</h1>
+<p>Le système de fichiers Unix utilise des <cite>inode</cite> pour stocker les meta-données relatives à un fichier/répertoire. Parmi les groupes d'affirmations suivants, un seul est correct. Lequel ?</p>
+<ul class="positive simple">
+<li><ul class="first">
+<li>deux fichiers se trouvant dans des répertoires différents sur le même disque peuvent avoir le même <cite>inode</cite></li>
+<li>le champ <tt class="docutils literal">nlinks</tt> est toujours positif</li>
+<li>un accès au fichier modifie le <tt class="docutils literal">atime</tt> associé à ce fichier</li>
+</ul>
+</li>
+</ul>
+<ul class="negative">
+<li><ul class="first simple">
+<li>deux fichiers ont toujours des <cite>inode</cite> différents</li>
+<li>l'<cite>inode</cite> contient le nom du fichier</li>
+<li>une écriture dans un fichier modifie le <tt class="docutils literal">mtime</tt> associé à ce fichier</li>
+</ul>
+<p class="comment">Les deux premières affirmations sont fausses.</p>
+</li>
+<li><ul class="first simple">
+<li>un fichier et un répertoire se trouvant sur le même disque peuvent avoir le même <cite>inode</cite></li>
+<li>une lecture dans un fichier modifie le <tt class="docutils literal">mtime</tt> associé à ce fichier</li>
+<li>l'<cite>inode</cite> contient le nom du fichier</li>
+</ul>
+<p class="comment">Toutes les affirmations sont fausses.</p>
+</li>
+<li><ul class="first simple">
+<li>une copie d'un fichier incrémente la valeur du champ <tt class="docutils literal">nlinks</tt> de son <cite>inode</cite></li>
+<li>une lecture dans un fichier modifie le <tt class="docutils literal">atime</tt> associé à ce fichier</li>
+<li>il n'y a jamais deux fichiers qui ont le même <cite>inode</cite></li>
+</ul>
+<p class="comment">La première et la troisième affirmation sont fausses.</p>
+</li>
+</ul>
+</div>
+<div class="section" id="question-6-manipulation-des-repertoires">
+<h1>Question 6. Manipulation des répertoires</h1>
+<p>Les répertoires sont des fichiers spéciaux. Pour les utiliser, il faut faire appel aux fonctions <a class="reference external" href="http://sites.uclouvain.be/SystInfo/manpages/man3/opendir.3.html">opendir(3)</a>, <a class="reference external" href="http://sites.uclouvain.be/SystInfo/manpages/man3/readdir.3.html">readdir(3)</a>  et <a class="reference external" href="http://sites.uclouvain.be/SystInfo/manpages/man3/closedir.3.html">closedir(3)</a>. Parmi les séquences d'instructions ci-dessous, laquelle permet de compter le nombre de fichiers se trouvant dans le répertoire courant ?</p>
+<div class="system-message">
+<p class="system-message-title">System Message: WARNING/2 (<tt class="docutils">qcm-9.rst</tt>, line 326)</p>
+<p>Cannot analyze code. Pygments package not found.</p>
+<pre class="literal-block">
+.. code-block:: c
+
+   /*
+    * name!=NULL
+    * retourne le nombre de fichiers dans le répertoire name
+    * et -1 en cas d'erreur
+    */
+
+</pre>
+</div>
+<ul class="positive">
+<li><div class="first system-message">
+<p class="system-message-title">System Message: WARNING/2 (<tt class="docutils">qcm-9.rst</tt>, line 337)</p>
+<p>Cannot analyze code. Pygments package not found.</p>
+<pre class="literal-block">
+.. code-block:: c
+
+   int nfiles(char * name) {
+
+     DIR *dirp;
+     struct dirent *dp;
+     dp=malloc(sizeof(struct dirent));
+     if(dp==NULL) {
+       return -1;
+     }
+     dirp = opendir(name);
+     if(dirp==NULL) {
+       return -1;
+     }
+     int count=0;
+     while ((dp = readdir(dirp)) != NULL) {
+        if (dp-&gt;d_type==DT_REG) {
+          count++;
+        }
+     }
+     int err = closedir(dirp);
+     if(err&lt;0) {
+        return -1;
+     }
+     return(count);
+   }
+
+
+</pre>
+</div>
+</li>
+<li></li>
+</ul>
+<ul class="negative">
+<li><div class="first system-message">
+<p class="system-message-title">System Message: WARNING/2 (<tt class="docutils">qcm-9.rst</tt>, line 370)</p>
+<p>Cannot analyze code. Pygments package not found.</p>
+<pre class="literal-block">
+.. code-block:: c
+
+   int nfiles(char * name) {
+
+     DIR *dirp;
+     struct dirent *dp;
+     dirp = opendir(name);
+     if(dirp==NULL) {
+       return -1;
+     }
+     int count=0;
+     while (readdir(dirp) != NULL) {
+          count++;
+     }
+     int err = closedir(dirp);
+     if(err&lt;0) {
+        return -1;
+     }
+     return(count);
+   }
+
+</pre>
+</div>
+<p class="comment">Ce code compte toutes les entrées dans le répertoire et pas seulement le fichiers.</p>
+</li>
+<li><div class="first system-message">
+<p class="system-message-title">System Message: WARNING/2 (<tt class="docutils">qcm-9.rst</tt>, line 396)</p>
+<p>Cannot analyze code. Pygments package not found.</p>
+<pre class="literal-block">
+.. code-block:: c
+
+    int nfiles2(char * name) {
+
+     DIR dirp;
+     struct dirent dp;
+     dirp = opendir(name);
+     if(dirp==-1) {
+       return -1;
+     }
+     int count=0;
+     while ((dp = readdir(dirp)) != -1) {
+          count++;
+     }
+
+     int err = closedir(dirp);
+     if(err&lt;0) {
+       return -1;
+     }
+     return(count);
+   }
+
+</pre>
+</div>
+<p class="comment">Ce code est erroné. <a class="reference external" href="http://sites.uclouvain.be/SystInfo/manpages/man3/opendir.3.html">opendir(3)</a> retourne un pointeur et <a class="reference external" href="http://sites.uclouvain.be/SystInfo/manpages/man3/readdir.3.html">readdir(3)</a> également.</p>
+</li>
+<li><div class="first system-message">
+<p class="system-message-title">System Message: WARNING/2 (<tt class="docutils">qcm-9.rst</tt>, line 423)</p>
+<p>Cannot analyze code. Pygments package not found.</p>
+<pre class="literal-block">
+.. code-block:: c
+
+   int nfiles(char * name) {
+
+     DIR dirp;
+     struct dirent dp;
+     dirp = opendir(name);
+     int count=0;
+     while ((dp = readdir(dirp)) != NULL) {
+        if (dp-&gt;d_type==DT_REG) {
+          count++;
+        }
+     }
+     int err = closedir(dirp);
+     if(err&lt;0) {
+        return -1;
+     }
+     return(count);
+   }
+
+</pre>
+</div>
+<p class="comment">Ce code est erroné. <a class="reference external" href="http://sites.uclouvain.be/SystInfo/manpages/man3/opendir.3.html">opendir(3)</a> retourne un pointeur et <a class="reference external" href="http://sites.uclouvain.be/SystInfo/manpages/man3/readdir.3.html">readdir(3)</a> également.</p>
+</li>
+</ul>
+</div>
+<div class="section" id="question-7-liens-symboliques">
+<h1>Question 7. Liens symboliques</h1>
+<p>Considérons un répertoire dans lequel les commandes suivantes sont exécutées :</p>
+<div class="system-message">
+<p class="system-message-title">System Message: WARNING/2 (<tt class="docutils">qcm-9.rst</tt>, line 455)</p>
+<p>Cannot analyze code. Pygments package not found.</p>
+<pre class="literal-block">
+.. code-block:: console
+
+   touch a
+   cp a b
+   ln a c
+   ln b d
+   echo &quot;test&quot; &gt; c
+   ln -s  d e
+   echo essai &gt; e
+
+</pre>
+</div>
+<p>Après exécution de ces commandes, un seul des groupes d'affirmations suivant est correct. Lequel ?</p>
+<ul class="positive simple">
+<li><ul class="first">
+<li>les fichiers <tt class="docutils literal">a</tt> et <tt class="docutils literal">c</tt> ont le même <cite>inode</cite></li>
+<li>les fichiers <tt class="docutils literal">b</tt> et <tt class="docutils literal">d</tt> ont la même taille</li>
+<li>l'<cite>inode</cite> correspondant au fichier <tt class="docutils literal">d</tt> indique qu'il y a deux liens vers lui</li>
+</ul>
+</li>
+<li><ul class="first">
+<li>les fichiers <tt class="docutils literal">d</tt> et <tt class="docutils literal">e</tt> ont des <cite>inode</cite> différents</li>
+<li>les fichiers <tt class="docutils literal">a</tt> et <tt class="docutils literal">c</tt> ont la même taille</li>
+<li>l'<cite>inode</cite> correspondant au fichier <tt class="docutils literal">b</tt> indique qu'il y a deux liens vers lui</li>
+</ul>
+</li>
+</ul>
+<ul class="negative">
+<li><ul class="first simple">
+<li>les fichiers <tt class="docutils literal">a</tt> et <tt class="docutils literal">c</tt> ont des <cite>inodes</cite> différents</li>
+<li>les fichiers <tt class="docutils literal">e</tt> et <tt class="docutils literal">d</tt> ont la même taille</li>
+<li>l'<cite>inode</cite> correspondant au fichier <tt class="docutils literal">d</tt> indique qu'il y a trois liens vers lui</li>
+</ul>
+</li>
+<li><ul class="first simple">
+<li>les fichiers <tt class="docutils literal">a</tt> et <tt class="docutils literal">d</tt> ont des <cite>inode</cite> différents</li>
+<li>les fichiers <tt class="docutils literal">b</tt> et <tt class="docutils literal">d</tt> ont la même taille</li>
+<li>l'<cite>inode</cite> correspondant au fichier <tt class="docutils literal">b</tt> indique qu'il y a trois liens vers lui</li>
+</ul>
+<p class="comment">Il y a deux liens (hard) vers le fichier <tt class="docutils literal">b</tt>. Le fichier <tt class="docutils literal">e</tt> est un lien symbolique vers ce fichier et non un lien <cite>hard</cite>.</p>
+</li>
+<li><ul class="first simple">
+<li>les fichiers <tt class="docutils literal">b</tt>, <tt class="docutils literal">d</tt> et <tt class="docutils literal">e</tt> ont le même <cite>inode</cite></li>
+<li>les fichiers <tt class="docutils literal">a</tt> et <tt class="docutils literal">c</tt> ont la même taille</li>
+<li>l'<cite>inode</cite> correspondant au fichier <tt class="docutils literal">a</tt> indique qu'il y a deux liens vers lui</li>
+</ul>
+</li>
+</ul>
+<!-- Links to be included -->
+</div>
+</div>
+</body>
+</html>
diff --git a/_static/src/C/S2-src/array.c b/_static/src/C/S2-src/array.c
new file mode 100644
index 0000000000000000000000000000000000000000..b9414f65d61180245ce5cf181f7ec6bb0f3ba488
--- /dev/null
+++ b/_static/src/C/S2-src/array.c
@@ -0,0 +1,97 @@
+/***********************************************
+ * array.c
+ *
+ * Programme d'exemple d'utilisation de tableaux
+ *
+ ***********************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+
+///AAA
+
+#define N 10
+int vecteur[N];
+float matriceC[N][N];
+float matriceR[N][2*N];
+
+///BBB
+
+// calcule la somme des éléments d'un tableau
+int sum(int v[])
+{
+  ///CCC
+  
+  int i;
+  int sum = 0;
+  for (i = 0; i < N; i++) {
+    sum += v[i];
+  }
+  
+  ///DDD
+  
+  return sum;
+}
+
+// calcule la somme des éléments d'un tableau
+int sum2(int size, int v[size])
+{
+  int i;
+  int sum = 0;
+  for (i = 0; i < size; i++) {
+    sum += v[i];
+  }
+  return sum;
+}
+
+#include <float.h>
+
+// retourne le maximum d'un matrice
+// carrée de NxN élément
+float max()
+{
+  ///EEE
+  #define L 2
+  #define C 3
+  float matriceR[L][C] = { {1.0,2.0,3.0},
+                           {4.0,5.0,6.0} };
+  int i, j;
+  float min = FLT_MAX;
+  for (i = 0; i < L; i++)
+    for (j = 0; j < C; j++)
+      if (matriceR[i][j] < min)
+        min=matriceR[i][j];
+    
+  ///FFF
+  return min;
+}
+
+// retourne le maximum d'un matrice
+// carrée de NxN élément
+float max2(int size, float mat[size][size]) {
+  int i,j;
+  float m=0.0; // corrige MINFLOAT
+  for(i=0;i<size;i++)
+    for(j=0;j<size;j++){
+      if(mat[i][j]>m)
+	m=mat[i][j];
+    }
+  return m;
+}
+
+
+int main(int argc, char *argv[]) {
+
+  ///CCC
+  int vecteur[N]={0,1,2,3,4,5,6,7,8,9};
+  int i;
+  int sum=0;
+  for(i=0;i<N; i++) {
+    sum+=vecteur[i];
+  }
+  ///DDD
+
+
+  return(EXIT_SUCCESS);
+}
+
diff --git a/_static/src/C/S2-src/arrayvar.c b/_static/src/C/S2-src/arrayvar.c
new file mode 100644
index 0000000000000000000000000000000000000000..eb5c7a77039b4678ee0d40a4c70eebfbbc1a3af5
--- /dev/null
+++ b/_static/src/C/S2-src/arrayvar.c
@@ -0,0 +1,46 @@
+/***********************************************
+ * arrayvar.c
+ *
+ * Programme d'exemple d'utilisation de tableaux
+ * de taille non prédéfinie à la compilation
+ *
+ ***********************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+
+#define N 10
+
+void init(int size, int v[]) {
+  int i;
+  for(i=0;i<size;i++)
+    v[i]=1;
+
+}
+
+
+int main(int argc, char *argv[]) {
+  /*
+  int size;
+  int vecteur[];
+  int i;
+  if(argc!=1) {
+    fprintf(stderr, "Usage : arrayvar n avec n entier\n");
+    return(EXIT_FAILURE);
+  }
+  size=atoi(argv[1]);
+  */
+
+  ///CCC
+  int vecteur[N]={0,1,2,3,4,5,6,7,8,9};
+  int i;
+  int sum=0;
+  for(i=0;i<N; i++) {
+    sum+=vecteur[i];
+  }
+  ///DDD
+
+
+  return(EXIT_SUCCESS);
+}
diff --git a/_static/src/C/S2-src/char-addr.c b/_static/src/C/S2-src/char-addr.c
new file mode 100644
index 0000000000000000000000000000000000000000..667a1f2b944c03623ea68a40679086cc04b3e2f2
--- /dev/null
+++ b/_static/src/C/S2-src/char-addr.c
@@ -0,0 +1,27 @@
+/***********************************************
+ * charaddr.c
+ *
+ * Pointeurs et chaînes de caractères
+ *
+ ***********************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+
+
+///BBB
+int main(int argc, char *argv[]) {
+
+///AAA
+
+  int i;
+  char name1[] = "str";
+  //  char name2[] = "SINF1252";
+
+  for(i=0;i<10;i++) {
+    printf("%c",name1[i]);
+  }
+
+  return(EXIT_SUCCESS);
+}
+
diff --git a/_static/src/C/S2-src/char.c b/_static/src/C/S2-src/char.c
new file mode 100644
index 0000000000000000000000000000000000000000..657e37b3bd10f813cf1bcdc90776f2a1c9d66061
--- /dev/null
+++ b/_static/src/C/S2-src/char.c
@@ -0,0 +1,36 @@
+/***********************************************
+ * strlen.c
+ *
+ * Initialisation de chaînes de caractères
+ *
+ ***********************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+
+
+///AAA
+
+int length(char str[]) {
+  int i=0;
+  while(str[i]!=0) { // '\0' et 0 sont égaux
+    i++;
+  }
+  return(i);
+}
+
+///BBB
+int main(int argc, char *argv[]) {
+
+  int i;
+  char name1[] = "str";
+  //  char name2[] = "SINF1252";
+
+  printf("Longueur de name1 [%s] : %d\n",name1,length(name1));
+  for(i=0;i<10;i++) {
+    printf("%c",name1[i]);
+  }
+
+  return(EXIT_SUCCESS);
+}
+
diff --git a/_static/src/C/S2-src/exprbin.c b/_static/src/C/S2-src/exprbin.c
new file mode 100644
index 0000000000000000000000000000000000000000..405d3f1b6a2546985dfd2407348da6a0e9012f85
--- /dev/null
+++ b/_static/src/C/S2-src/exprbin.c
@@ -0,0 +1,104 @@
+/***********************************************
+ * exprbin.c
+ *
+ * Programme d'exemple d'utilisation d'expressions
+ * binaires
+ *
+ ***********************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <stdlib.h>
+#define BITS_CHAR 8
+
+///EEE
+#define BITS_INT 32
+// str[BITS_INT]
+void int2bin(unsigned int num, char *str)
+{
+  int i;
+  str[BITS_INT] = '\0';
+  for (i = BITS_INT - 1; i >= 0; i--) {
+    if ((num & 1) == 1)
+      str[i] = '1';
+    else
+      str[i] = '0';
+    num = num >> 1;
+  }
+}
+///FFF
+
+// str[32]
+void char2bin(unsigned char num, char *str)
+{
+  int i;
+  str[BITS_CHAR]='\0';
+  for(i=BITS_CHAR-1; i>=0; i--) {
+    if( (num & 1)==1)
+      str[i]='1';
+    else
+      str[i]='0';
+    num = num >> 1;
+  }
+}
+
+
+
+int main(int argc, char *argv[]) {
+
+  unsigned char zero='\0'; ///EEE
+  unsigned char a=0xFA;
+  unsigned char b=0x5F;
+  unsigned char c=0x50;
+  unsigned char d=0x50;
+
+  unsigned char r;
+  unsigned int i1,i2,i3;
+  i1=0;
+  i2=0x4;
+  i3=0x5;
+
+  char str1[32];
+  char str2[32];
+  char str3[32];
+
+  char2bin(zero,str1);
+  char2bin(~zero,str2);
+  printf("~ %s = %s\n",str1,str2);
+  char2bin(a,str1);
+  char2bin(b,str2);
+  char2bin(a&b,str3);
+  printf("%s & %s = %s\n",str1,str2,str3);
+  char2bin(a,str1);
+  char2bin(b,str2);
+  char2bin(a|b,str3);
+  printf("%s | %s = %s\n",str1,str2,str3);
+  char2bin(a^b,str3);
+  printf("%s ^ %s = %s\n",str1,str2,str3);
+
+///AAA
+
+r = ~a;    // négation bit à bit
+r = a & b; // conjonction bit à bit
+r = a | b; // disjonction bit à bit
+r = a ^ b; // xor bit à bit
+
+///BBB
+
+///CCC
+
+r = c & 0x7E; // 0b01111110 force les bits de poids faible et fort à 0
+r = d | 0x18; // 0b00011000 force les bits 4 et 3 à 1
+
+///DDD
+
+  /*
+  printf("0x%x & 0x%x = 0x%x\n",i2,i3,i2 & i3);
+  printf("0x%x && 0x%x = 0x%8x\n",i2,i3,i2 && i3);
+  printf("0x%x | 0x%x = 0x%8x\n",i2,i3,i2 | i3);
+  printf("0x%x || 0x%x = 0x%8x\n",i2,i3,i2 || i3);
+  */
+
+  return(EXIT_SUCCESS);
+}
diff --git a/_static/src/C/S2-src/exprbin.out b/_static/src/C/S2-src/exprbin.out
new file mode 100644
index 0000000000000000000000000000000000000000..01ca81de56e2d8d0cafd5cd17632a1891de76154
--- /dev/null
+++ b/_static/src/C/S2-src/exprbin.out
@@ -0,0 +1,4 @@
+~ 00000000 = 11111111
+11111010 & 01011111 = 01011010
+11111010 | 01011111 = 11111111
+11111010 ^ 01011111 = 10100101
diff --git a/_static/src/C/S2-src/fct.c b/_static/src/C/S2-src/fct.c
new file mode 100644
index 0000000000000000000000000000000000000000..4c407b0d9d932105c8d4bf5364912320c79c5374
--- /dev/null
+++ b/_static/src/C/S2-src/fct.c
@@ -0,0 +1,79 @@
+/***********************************************
+ * fct.c
+ *
+ * Programme d'exemple d'utilisation de fonctions
+ *
+ ***********************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+///AAA
+
+void usage()
+{
+  printf("Usage : ...\n");
+}
+
+///BBB
+
+///CCC
+
+int twotimes(int n)
+{
+  return 2 * n;
+}
+
+int two_times(int n)
+{
+  n = 2 * n;
+  return n;
+}
+
+///DDD
+
+
+///EEE
+
+int times_two(int *n)
+{
+  return (*n) + (*n);
+}
+
+int timestwo(int *n)
+{
+  *n = (*n) + (*n);
+  return *n;
+}
+
+void f()
+{
+  int i = 1252;
+  printf("i:%d\n", i);
+  printf("times_two(&i)=%d\n", times_two(&i));
+  printf("après times_two, i:%d\n", i);
+  printf("timestwo(&i)=%d\n", timestwo(&i));
+  printf("après timestwo, i:%d\n", i);
+}
+
+///FFF
+
+void plusun(int size, int *v) {
+  int i;
+  for(i=0;i<size;i++)
+    v[i]++;
+}
+
+///GGG
+
+
+int main(int argc, char *argv[]) {
+
+  int i=1252;
+  int j;
+
+  f();
+
+   return(EXIT_SUCCESS);
+}
diff --git a/_static/src/C/S2-src/fct.h b/_static/src/C/S2-src/fct.h
new file mode 100644
index 0000000000000000000000000000000000000000..5f423f84bd19fb926bdee8cb4a03b22a5dfba740
--- /dev/null
+++ b/_static/src/C/S2-src/fct.h
@@ -0,0 +1,11 @@
+/***********************************************
+ * fct.h
+ *
+ * Exemple de signatures de fonctions
+ *
+ ***********************************************/
+
+///HHH
+int times_two(int *);
+int timestwo(int *);
+///III
diff --git a/_static/src/C/S2-src/fct.out b/_static/src/C/S2-src/fct.out
new file mode 100644
index 0000000000000000000000000000000000000000..8c4f1575eff2047ccbdceacd2ea44afa1bc2df53
--- /dev/null
+++ b/_static/src/C/S2-src/fct.out
@@ -0,0 +1,5 @@
+i:1252
+times_two(&i)=2504
+après times_two, i:1252
+timestwo(&i)=2504
+après timestwo, i:2504
diff --git a/_static/src/C/S2-src/fctargs.c b/_static/src/C/S2-src/fctargs.c
new file mode 100644
index 0000000000000000000000000000000000000000..a08a229a46cb03841fd895888dcfbde383864d44
--- /dev/null
+++ b/_static/src/C/S2-src/fctargs.c
@@ -0,0 +1,65 @@
+/***********************************************
+ * fctargs.c
+ *
+ * Programme d'exemple d'utilisation de fonctions
+ * montre l'importance de traiter les arguments en
+ * ordre
+ *
+ ***********************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+#define N 5
+///AAA
+int length(char c[]) {
+  int i=0;
+  while(c[i]!='\0')
+    i++;
+  return (i);
+}
+///BBB
+
+///CCC
+void plusun(int size, int *v)
+{
+  int i;
+  for (i = 0; i < size; i++)
+    v[i]++;
+}
+
+void print_vecteur(int size, int*v) {
+  int i;
+  printf("v={");
+  for (i = 0;i < size - 1; i++)
+    printf("%d,", v[i]);
+    
+  if (size > 0)
+    printf("%d}", v[size - 1]);
+  else
+    printf("}");
+}
+///DDD
+
+void wrong() {
+  int vecteur[N]={1,2,3,4,5};
+  /// provoque un segmentation fault
+  ///GGG
+  plusun(vecteur,N);
+  print_vecteur(N,vecteur);
+  ///HHH
+}
+
+
+int main(int argc, char *argv[]) {
+
+///EEE
+int vecteur[N] = {1, 2, 3, 4, 5};
+plusun(N, vecteur);
+print_vecteur(N, vecteur);
+///FFF
+
+  return EXIT_SUCCESS;
+}
diff --git a/_static/src/C/S2-src/foobar.c b/_static/src/C/S2-src/foobar.c
new file mode 100644
index 0000000000000000000000000000000000000000..c54fe40d0e88999c739aff1f8cf84b72dbcfd54f
--- /dev/null
+++ b/_static/src/C/S2-src/foobar.c
@@ -0,0 +1,25 @@
+/***********************************************
+ * foobar.c
+ *
+ * Exercice
+ *
+ ***********************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+void foo(void) {
+  int a = 42;
+    printf("%d\n", a);
+}
+
+void bar(void) {
+// cppcheck-suppress uninitvar  ;
+  int a;
+  printf("%d\n", a);
+}
+// cppcheck-suppress uninitvar //
+int main(int argc, char *argv[]) {
+  foo();
+  bar();
+  return(EXIT_SUCCESS);
+}
diff --git a/_static/src/C/S2-src/int2bin.c b/_static/src/C/S2-src/int2bin.c
new file mode 100644
index 0000000000000000000000000000000000000000..f0cf288853724c63857dfeaf4c4a9e9045e50373
--- /dev/null
+++ b/_static/src/C/S2-src/int2bin.c
@@ -0,0 +1,36 @@
+/**********************************************
+ * int2bin
+ *
+ * Conversion d'entier non signé en binaire
+ *
+ ***********************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#define MAXSIZE 33 // nombre maximum de bits+1
+
+void print_bin(int num) {
+  int i;
+  int n=num;
+  char str[MAXSIZE];
+  i=MAXSIZE;
+  while (--i>=0) {
+    str[i] = n & 1 ? '1' : '0';
+    n >>= 1;
+  }
+  printf("La valeur de %d en hexadécimal est %x  et en binaire : %s\n",num,num,str);
+
+}
+
+int main(int argc, char *argv[]) {
+
+  int n=7654321;
+  print_bin(n);
+  print_bin(123);
+  print_bin(987654321);
+
+  return(EXIT_SUCCESS);
+}
+
+// inspiré de http://stackoverflow.com/questions/111928/is-there-a-printf-converter-to-print-in-binary-format
diff --git a/_static/src/C/S2-src/num.c b/_static/src/C/S2-src/num.c
new file mode 100644
index 0000000000000000000000000000000000000000..d0f045decb10c5e20191f04f0b22e96da13525c2
--- /dev/null
+++ b/_static/src/C/S2-src/num.c
@@ -0,0 +1,24 @@
+/***********************************************
+ * num
+ *
+ * Déclaration de nombres
+ *
+ ***********************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+
+int main(int argc, char *argv[])
+{
+  ///AAA
+
+  int i;
+  i = 123;   // décimal
+  i = 0x7b;  // hexadécimal
+  i = 0173;  // octal !!
+  //  i = 0b1111011; // binaire, seulement certains compilateurs
+
+  ///BBB
+  
+  return EXIT_SUCCESS;
+}
diff --git a/_static/src/C/S2-src/octal.c b/_static/src/C/S2-src/octal.c
new file mode 100644
index 0000000000000000000000000000000000000000..b2796c9659f5e477b0693577e47652ae64a8bec2
--- /dev/null
+++ b/_static/src/C/S2-src/octal.c
@@ -0,0 +1,27 @@
+/***********************************************
+ * octal
+ *
+ * Exemple d'erreur avec les nombres en octal
+ *
+ ***********************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+
+int main(int argc, char *argv[])
+{
+
+  ///AAA
+
+  int i, j;
+  i = 65;   // décimal
+  j = 065;  // octal !!!
+  if (i == j)
+    printf("%d et %d sont égaux\n", i, j);
+  else
+    printf("%d et %d sont différents\n", i, j);
+
+   ///BBB
+   
+   return EXIT_SUCCESS;
+}
diff --git a/_static/src/C/S2-src/perf.c b/_static/src/C/S2-src/perf.c
new file mode 100644
index 0000000000000000000000000000000000000000..a31da934037b771956cf3979fcec0aa30e8e76ef
--- /dev/null
+++ b/_static/src/C/S2-src/perf.c
@@ -0,0 +1,53 @@
+/***********************************************
+ * perf.c
+ *
+ * Mesure de temps de calcul via gettimeofday
+ *
+ ***********************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/time.h>
+
+/* Return t2-t1 in microseconds */
+long timeval_diff(struct timeval *t2, struct timeval *t1)
+{
+  long diff = (t2->tv_usec + 1000000 * t2->tv_sec) - (t1->tv_usec + 1000000 * t1->tv_sec);
+  return (diff);
+}
+// n : number of iterations of the loop
+void compute(int n) {
+  // long computation
+  double sum=0;
+  int i;
+  for(i=0;i<n;i++) {
+    sum=sum+i;
+  }
+}
+
+int main(int argc, char *argv[])
+{
+  struct timeval tvStart, tvEnd;
+  int err;
+  int num; // number of operations for compute
+  if(argc!=2)
+    exit(EXIT_FAILURE);
+  else
+    num=atoi(argv[1]);
+
+  err=gettimeofday(&tvStart, NULL);
+  if(err!=0)
+    exit(EXIT_FAILURE);
+
+  // long computation
+  compute(num);
+
+  err=gettimeofday(&tvEnd, NULL);
+  if(err!=0)
+    exit(EXIT_FAILURE);
+
+  printf("Duration : %ld microseconds\n", timeval_diff(&tvEnd, &tvStart));
+
+  return(EXIT_SUCCESS);
+}
+
diff --git a/_static/src/C/S2-src/ptr.c b/_static/src/C/S2-src/ptr.c
new file mode 100644
index 0000000000000000000000000000000000000000..1e02c8fe1bd24418e7a238fc206c17df91fc66ad
--- /dev/null
+++ b/_static/src/C/S2-src/ptr.c
@@ -0,0 +1,28 @@
+/***********************************************
+ * ptr
+ *
+ * Programme d'exemple d'utilisation de pointeurs
+ *
+ ***********************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+
+int main(int argc, char *argv[]) {
+
+  ///AAA
+
+  int i = 1252;
+  char str[] = "sinf1252";
+  char c = 'c';
+
+  printf("i vaut %d, occupe %ld bytes et est stocké à l'adresse : %p\n", 
+         i, sizeof(i), &i);
+  printf("c vaut %c, occupe %ld bytes et est stocké à l'adresse : %p\n", 
+         c, sizeof(c), &c);
+  printf("str contient \"%s\" et est stocké à partir de l'adresse : %p\n", 
+         str, &str);
+  
+  ///BBB
+  return EXIT_SUCCESS;
+}
diff --git a/_static/src/C/S2-src/ptr.out b/_static/src/C/S2-src/ptr.out
new file mode 100644
index 0000000000000000000000000000000000000000..a4ade1396ffc919267443e148d49a006958ab8a1
--- /dev/null
+++ b/_static/src/C/S2-src/ptr.out
@@ -0,0 +1,3 @@
+i vaut 1252, occupe 4 bytes et est stocké à l'adresse : 0x7fff89f99cbc
+c vaut c, occupe 1 bytes et est stocké à l'adresse : 0x7fff89f99caf
+str contient "sinf1252" et est stocké à partir de l'adresse : 0x7fff89f99cb0
diff --git a/_static/src/C/S2-src/ptrchar.c b/_static/src/C/S2-src/ptrchar.c
new file mode 100644
index 0000000000000000000000000000000000000000..ce253e2f81fc1c80e041b526da00d805fc0992d7
--- /dev/null
+++ b/_static/src/C/S2-src/ptrchar.c
@@ -0,0 +1,34 @@
+/***********************************************
+ * ptrchar
+ *
+ * Programme d'exemple d'utilisation de pointeurs
+ *
+ ***********************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+int main(int argc, char *argv[]) {
+
+  ///AAA
+  char c='Z';
+  char str[]="sinf1252";
+  char *str_ptr=NULL;
+  int i;
+
+  str_ptr=&c;
+  printf("c vaut %c et est stocké à l'adresse : %p\n",c,&c);
+  printf("*str_ptr vaut %p et pointe vers %c\n",str_ptr,*(str_ptr));
+  str_ptr=str; // équivaut à  str_ptr=&(str[0]);
+  printf("après str_ptr=str[];\n");
+  printf("*str_ptr vaut %p et pointe vers %c\n",str_ptr,*(str_ptr));
+  printf("Contenu du tableau\n");
+  for(i=0;i<strlen(str);i++) {
+    printf("str[%d]=%c et *(str_ptr+%d) contient %c\n",i,str[i],i,*(str_ptr+i));
+  }
+
+
+   ///BBB
+   return(EXIT_SUCCESS);
+}
diff --git a/_static/src/C/S2-src/ptrex.c b/_static/src/C/S2-src/ptrex.c
new file mode 100644
index 0000000000000000000000000000000000000000..7b7cbb6372b0435ac9a92569188033451d298337
--- /dev/null
+++ b/_static/src/C/S2-src/ptrex.c
@@ -0,0 +1,33 @@
+/***********************************************
+ * ptrex.c
+ *
+ * Programme d'exemple d'utilisation de pointeurs
+ *
+ ***********************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+int main(int argc, char *argv[]) {
+
+  ///AAA
+
+  int i = 1;           // entier
+  int *ptr_i;          // pointeur vers un entier
+  char str[] = "Unix";
+  char *s;             // pointeur vers un char
+
+  ptr_i = &i;
+  printf("valeur de i : %d, valeur pointée par ptr_i : %d\n", i, *ptr_i);
+  *ptr_i = *ptr_i + 1252;
+  printf("valeur de i : %d, valeur pointée par ptr_i : %d\n", i, *ptr_i);
+  s = str;
+  for (i = 0; i < strlen(str); i++){
+    printf("valeur de str[%d] : %c, valeur pointée par *(s+%d) : %c\n",
+           i, str[i], i, *(s+i));
+  }
+
+  ///BBB
+  return EXIT_SUCCESS;
+}
diff --git a/_static/src/C/S2-src/ptrex.out b/_static/src/C/S2-src/ptrex.out
new file mode 100644
index 0000000000000000000000000000000000000000..43314a5863d5a297306b4d406f22bc75cc79afa1
--- /dev/null
+++ b/_static/src/C/S2-src/ptrex.out
@@ -0,0 +1,6 @@
+valeur de i : 1, valeur pointée par ptr_i : 1
+valeur de i : 1253, valeur pointée par ptr_i : 1253
+valeur de str[0] : U, valeur pointée par *(s+0) : U
+valeur de str[1] : n, valeur pointée par *(s+1) : n
+valeur de str[2] : i, valeur pointée par *(s+2) : i
+valeur de str[3] : x, valeur pointée par *(s+3) : x
diff --git a/_static/src/C/S2-src/random.c b/_static/src/C/S2-src/random.c
new file mode 100644
index 0000000000000000000000000000000000000000..51a211f80a795a4ed2c328969ecf2604cc06ba37
--- /dev/null
+++ b/_static/src/C/S2-src/random.c
@@ -0,0 +1,29 @@
+/***********************************************
+ * random
+ *
+ * Utilisation de nombres aléatoires
+ *
+ ***********************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+
+int main(int argc, char *argv[]) {
+
+  ///AAA
+
+ long int r;
+ int i;
+ int pair=0;
+ unsigned int seed=1252;  // semence initiale
+ srandom(seed);
+ for(i=0;i<10000;i++) {
+   r=random();
+   if (r%2==0)
+     pair++;
+ }
+ printf("%d nombres pairs ont été générés\n",pair);
+   ///BBB
+   return(EXIT_SUCCESS);
+}
+
diff --git a/_static/src/C/S2-src/short.c b/_static/src/C/S2-src/short.c
new file mode 100644
index 0000000000000000000000000000000000000000..f7452beab3cc1923aaae496e3776fadd53162994
--- /dev/null
+++ b/_static/src/C/S2-src/short.c
@@ -0,0 +1,34 @@
+/***********************************************
+ * short
+ *
+ * Overflow sur les shorts
+ *
+ ***********************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+
+int main(int argc, char *argv[])
+{
+  ///AAA
+
+  short int i = 1;
+  unsigned short j = 1;
+  int n;
+  
+  printf("\nPuissances de 5 en notation signée\n");
+  for (n = 1; n < 10; n++) {
+    i = i * 5;
+    printf("5^%d=%d\n", n, i);
+  }
+  
+  printf("\nPuissances de 10 en notation non signée\n");
+  for (n = 1; n < 10; n++) {
+    j = j * 10;
+    printf("10^%d=%d\n", n, j);
+  }
+
+   ///BBB
+
+   return EXIT_SUCCESS;
+}
diff --git a/_static/src/C/S2-src/short.out b/_static/src/C/S2-src/short.out
new file mode 100644
index 0000000000000000000000000000000000000000..eb18f95164070ca249dba78e92402d38223be12e
--- /dev/null
+++ b/_static/src/C/S2-src/short.out
@@ -0,0 +1,22 @@
+
+Puissances de 5 en notation signée
+5^1=5
+5^2=25
+5^3=125
+5^4=625
+5^5=3125
+5^6=15625
+5^7=12589
+5^8=-2591
+5^9=-12955
+
+Puissances de 10 en notation non signée
+10^1=10
+10^2=100
+10^3=1000
+10^4=10000
+10^5=34464
+10^6=16960
+10^7=38528
+10^8=57600
+10^9=51712
diff --git a/_static/src/C/S2-src/sizeof.c b/_static/src/C/S2-src/sizeof.c
new file mode 100644
index 0000000000000000000000000000000000000000..1f604959c96f3b7e25265f9ce7e452a8b2d99969
--- /dev/null
+++ b/_static/src/C/S2-src/sizeof.c
@@ -0,0 +1,33 @@
+/**********************************************
+ * sizeof
+ *
+ * Programme d'exemple d'utilisation de sizeof
+ *
+ ***********************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+
+int main(int argc, char *argv[]) {
+
+  ///AAA
+
+  printf("Type\t\t\tTaille\n");
+  printf("\n");
+  printf("char\t\t\t%ld octet(s)\n",sizeof(char));
+  printf("unsigned char\t\t%ld octet(s)\n",sizeof(unsigned char));
+  printf("short\t\t\t%ld octet(s)\n",sizeof(short));
+  printf("unsigned short\t\t%ld octet(s)\n",sizeof(unsigned short));
+  printf("int\t\t\t%ld octet(s)\n",sizeof(int));
+  printf("unsigned int\t\t%ld octet(s)\n",sizeof(unsigned int));
+  printf("long\t\t\t%ld octet(s)\n",sizeof(long));
+  printf("unsigned long\t\t%ld octet(s)\n",sizeof(unsigned long));
+  printf("long long\t\t%ld octet(s)\n",sizeof(long long));
+  printf("unsigned long long\t%ld octet(s)\n",sizeof(unsigned long long));
+  printf("float\t\t\t%ld octet(s)\n",sizeof(float));
+  printf("double\t\t\t%ld octet(s)\n",sizeof(double));
+  printf("long double\t\t%ld octet(s)\n",sizeof(long double));
+
+   ///BBB
+   return(EXIT_SUCCESS);
+}
diff --git a/_static/src/C/S2-src/sizeofptr.c b/_static/src/C/S2-src/sizeofptr.c
new file mode 100644
index 0000000000000000000000000000000000000000..29a2b7cdfcdadc71103bf67fe0f117c39bab687f
--- /dev/null
+++ b/_static/src/C/S2-src/sizeofptr.c
@@ -0,0 +1,32 @@
+/**********************************************
+ * sizeofptr
+ *
+ * Programme d'exemple d'utilisation de sizeof
+ *
+ ***********************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+
+int main(int argc, char *argv[]) {
+
+
+  printf("Type\t\t\tTaille\n");
+  printf("\n");
+  printf("char *\t\t\t%ld octet(s)\n",sizeof(char *));
+  printf("unsigned char *\t\t%ld octet(s)\n",sizeof(unsigned char *));
+  printf("short *\t\t\t%ld octet(s)\n",sizeof(short *));
+  printf("unsigned short *\t%ld octet(s)\n",sizeof(unsigned short *));
+  printf("int *\t\t\t%ld octet(s)\n",sizeof(int *));
+  printf("unsigned int *\t\t%ld octet(s)\n",sizeof(unsigned int *));
+  printf("long *\t\t\t%ld octet(s)\n",sizeof(long *));
+  printf("unsigned long *\t\t%ld octet(s)\n",sizeof(unsigned long *));
+  printf("long long *\t\t%ld octet(s)\n",sizeof(long long *));
+  printf("unsigned long long *\t%ld octet(s)\n",sizeof(unsigned long long *));
+  printf("float *\t\t\t%ld octet(s)\n",sizeof(float *));
+  printf("double *\t\t%ld octet(s)\n",sizeof(double *));
+  printf("long double *\t\t%ld octet(s)\n",sizeof(long double *));
+
+   ///BBB
+   return(EXIT_SUCCESS);
+}
diff --git a/_static/src/C/S2-src/strlen.c b/_static/src/C/S2-src/strlen.c
new file mode 100644
index 0000000000000000000000000000000000000000..a623e5b6ddaa0e85a280872e674c821bcab382bc
--- /dev/null
+++ b/_static/src/C/S2-src/strlen.c
@@ -0,0 +1,39 @@
+/***********************************************
+ * strlen.c
+ *
+ * Initialisation de chaînes de caractères
+ *
+ ***********************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+
+
+///AAA
+
+int length(char str[])
+{
+  int i = 0;
+  while (str[i] != 0) {// '\0' et 0 sont égaux
+    i++;
+  }
+  return i;
+}
+
+///BBB
+
+int main(int argc, char *argv[])
+{
+
+  int i;
+  char name1[] = "str";
+  //  char name2[] = "SINF1252";
+
+  printf("Longueur de name1 [%s] : %d\n", name1, length(name1));
+  for (i = 0; i < length(str); i++) {
+    printf("%c", name1[i]);
+  }
+
+  return EXIT_SUCCESS;
+}
+
diff --git a/_static/src/C/S2-src/strlenptr.c b/_static/src/C/S2-src/strlenptr.c
new file mode 100644
index 0000000000000000000000000000000000000000..7030859576476982b386f674b81805cec6bae7c8
--- /dev/null
+++ b/_static/src/C/S2-src/strlenptr.c
@@ -0,0 +1,36 @@
+/***********************************************
+ * strlen.c
+ *
+ * Calcul de longueur de chaînes avec pointeurs
+ *
+ ***********************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+
+///AAA
+
+int length(char *s)
+{
+  int i = 0;
+  while (*(s+i) != '\0')
+    i++;
+  return i;
+}
+
+///BBB
+
+int main(int argc, char *argv[])
+{
+  int i;
+  char name1[] = "str";
+  //  char name2[] = "SINF1252";
+
+  printf("Longueur de name1 [%s] : %d\n", name1, length(name1));
+  for (i = 0; i < 10; i++) {
+    printf("%c", name1[i]);
+  }
+
+  return EXIT_SUCCESS;
+}
+
diff --git a/_static/src/C/S2-src/struct.c b/_static/src/C/S2-src/struct.c
new file mode 100644
index 0000000000000000000000000000000000000000..dac885b590fce623c5e37e4cda0142ecbdc39972
--- /dev/null
+++ b/_static/src/C/S2-src/struct.c
@@ -0,0 +1,103 @@
+/***********************************************
+ * struct.c
+ *
+ * Programme d'exemple de structures
+ *
+ ***********************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+///AAA
+
+// structure pour stocker une coordonnée 3D
+struct coord {
+  int x;
+  int y;
+  int z;
+};
+
+struct coord point = {1, 2, 3};
+struct coord p;
+
+// structure pour stocker une fraction
+struct fraction {
+  int numerator;
+  int denominator;
+};
+
+struct fraction demi = {1, 2};
+struct fraction f;
+
+// structure pour représenter un étudiant
+struct student {
+  int matricule;
+  char prenom[20];
+  char nom[30];
+};
+
+struct student s = {1, "Linus", "Torvalds"};
+
+///BBB
+
+///EEE
+struct fraction init(int num, int den)
+{
+  struct fraction f;
+  f.numerator = num;
+  f.denominator = den;
+  return f;
+}
+
+int equal(struct fraction f1, struct fraction f2)
+{
+  return ((f1.numerator == f2.numerator) 
+          && (f1.denominator == f2.denominator));
+}
+
+int equalptr(struct fraction *f1, struct fraction *f2)
+{
+  return ((f1->numerator==f2->numerator)
+          && (f1->denominator==f2->denominator));
+}
+
+void initptr(struct fraction *f, int num, int den)
+{
+  f->numerator = num;
+  f->denominator = den;
+}
+///FFF
+
+int main(int argc, char *argv[])
+{
+
+  int c[3] = {0, 0, 0};
+
+///CCC
+
+point.x = 1;
+point.y = 2;
+point.z = 3;
+
+///DDD
+
+///GGG
+
+struct fraction quart;
+struct fraction tiers;
+quart = init(1, 4);
+initptr(&tiers, 1, 3);
+printf("equal(tiers,quart)=%d\n", equal(tiers, quart));
+printf("equalptr(&tiers,&quart)=%d\n", equalptr(&tiers, &quart));
+
+///HHH
+
+  f.numerator=1;
+  f.denominator=4;
+  printf("%c\n",s.prenom[2]);
+  printf("sizeof int[3]=%ld, sizeof coord=%ld\n",sizeof(c),sizeof(struct coord));
+  printf("sizeof student : %ld\n",sizeof(s));
+
+   return(EXIT_SUCCESS);
+}
diff --git a/_static/src/C/S2-src/structptr.c b/_static/src/C/S2-src/structptr.c
new file mode 100644
index 0000000000000000000000000000000000000000..59b93ebda18435e2ab1eb0d91204b9326039073e
--- /dev/null
+++ b/_static/src/C/S2-src/structptr.c
@@ -0,0 +1,37 @@
+/***********************************************
+ * structptr.c
+ *
+ * Programme d'exemple de pointeurs vers des
+ * structures
+ *
+ ***********************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+int main(int argc, char *argv[])
+{
+
+  struct fraction {
+    int num;
+    int den;
+  };
+
+///AAA
+struct fraction demi, quart;
+struct fraction *demi_ptr;
+struct fraction *quart_ptr;
+
+demi_ptr = &demi;
+quart_ptr = &quart;
+
+(*demi_ptr).num = 1;
+(*demi_ptr).den = 2;
+
+quart_ptr->num = 1;
+quart_ptr->den = 4;
+///BBB
+
+  return EXIT_SUCCESS;
+}
diff --git a/_static/src/C/S2-src/time.c b/_static/src/C/S2-src/time.c
new file mode 100644
index 0000000000000000000000000000000000000000..3b082a83db74d7d7a100510ebb54995d832ddab6
--- /dev/null
+++ b/_static/src/C/S2-src/time.c
@@ -0,0 +1,69 @@
+/***********************************************
+ * struct.c
+ *
+ * Programme d'exemple de structures
+ *
+ ***********************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+///AAA
+
+// structure pour stocker une coordonnée 3D
+struct coord {
+  int x;
+  int y;
+  int z;
+} ;
+
+struct coord origin={1,2,3};
+struct coord p;
+
+// structure pour stocker une fraction
+struct fraction {
+  double numerator;
+  double denominator;
+};
+
+struct fraction demi={1.0,2.0};
+struct fraction f;
+
+// structure pour représenter un étudiant
+struct student {
+  int matricule;
+  char prenom[20];
+  char nom[30];
+};
+
+struct student s={1,"Linux","Torvalds"};
+
+///BBB
+
+///EEE
+
+int equal(struct fraction f1, struct fraction f2) {
+  return ( (f1.numerator==f2.numerator) &&
+	   (f1.denominator==f2.denominator) );
+}
+
+///FFF
+
+int main(int argc, char *argv[]) {
+  int c[3]={0,0,0};
+
+  ///CCC
+  origin.x=1;
+  origin.y=2;
+  origin.z=3;
+  ///DDD
+
+  f.numerator=1;
+  f.denominator=4;
+  printf("%c\n",s.prenom[2]);
+  printf("sizeof int[3]=%ld, sizeof coord=%ld\n",sizeof(c),sizeof(struct coord));
+  printf("sizeof student : %ld\n",sizeof(s));
+
+   return(EXIT_SUCCESS);
+}
diff --git a/_static/src/C/S2-src/toupper.c b/_static/src/C/S2-src/toupper.c
new file mode 100644
index 0000000000000000000000000000000000000000..cf87bc40a7795e9dc56e9fcedc28f523570e28a3
--- /dev/null
+++ b/_static/src/C/S2-src/toupper.c
@@ -0,0 +1,31 @@
+/***********************************************
+ * toupper.c
+ *
+ * Conversion de caractères
+ *
+ ***********************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+
+///AAA
+
+// conversion de minuscules en majuscules
+int toUpper(char c) {
+  if (c >= 'a' && c <= 'z')
+    return c + ('A' - 'a');
+  else
+    return c;
+}
+///BBB
+
+int main(int argc, char *argv[])
+{
+
+  printf("%c\n",toUpper('g'));
+  printf("%c\n",toUpper('='));
+  printf("%c\n",toUpper('Z'));
+  printf("%c\n",toUpper('x'));
+
+   return EXIT_SUCCESS;
+}
diff --git a/_static/src/C/S2-src/typedef.c b/_static/src/C/S2-src/typedef.c
new file mode 100644
index 0000000000000000000000000000000000000000..988cd9dedbfc60e92b3ab19b60e9e36d2447e491
--- /dev/null
+++ b/_static/src/C/S2-src/typedef.c
@@ -0,0 +1,37 @@
+/***********************************************
+ * typedef.c
+ *
+ * Programme d'exemple d'utilisation de typedef
+ *
+ ***********************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+
+///EEE
+typedef unsigned int u_int_t;
+typedef unsigned long u_long_t;
+///FFF
+
+///CCC
+typedef int * int_ptr;
+typedef char * string;
+///DDD
+
+///AAA
+// structure pour stocker une fraction
+typedef struct fraction {
+  double numerator;
+  double denominator;
+} Fraction ;
+
+typedef int Entier;
+
+int main(int argc, char *argv[])
+{
+  Fraction demi = {1, 2};
+  Entier i = 2;
+  // ...
+  return EXIT_SUCCESS;
+}
+///BBB
diff --git a/_static/src/C/S2-src/xor.c b/_static/src/C/S2-src/xor.c
new file mode 100644
index 0000000000000000000000000000000000000000..9466a8228fae60901803ac6d8651831afbfc5e46
--- /dev/null
+++ b/_static/src/C/S2-src/xor.c
@@ -0,0 +1,34 @@
+/***********************************************
+ * xor.c
+ *
+ * Programme d'exemple d'encryptage avec XOR
+ *
+ ***********************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+// affiche un message d'erreur
+void usage(char *msg)
+{
+  fprintf(stderr,"Usage : %s\n",msg);
+  exit(EXIT_FAILURE);
+}
+
+///AAA
+int main(int argc, char* argv[])
+{
+  if (argc != 2)
+    usage("ce programme prend une clé comme argument");
+
+  char *key = argv[1];
+  char c;
+  int i = 0;
+  while (((c = getchar()) != EOF) && (i < strlen(key))) {
+    putchar(c ^ *(key + i));
+    i++;
+  }
+  return EXIT_SUCCESS;
+}
+///BBB
diff --git a/_static/src/C/S3-src/argv-env.c b/_static/src/C/S3-src/argv-env.c
new file mode 100644
index 0000000000000000000000000000000000000000..7800144572cd51b561dfecbcb55ec4d4f309e9bf
--- /dev/null
+++ b/_static/src/C/S3-src/argv-env.c
@@ -0,0 +1,42 @@
+/**************************************
+ * arg-env.c
+ *
+ * Arguments et variables d'environnement
+ *
+ **************************************/
+
+///AAA
+#include <stdio.h>
+#include <stdlib.h>
+
+// affiche la valeur de la variable d'environnement var
+void print_var(char *var) {
+  char *val=getenv(var);
+  if(val!=NULL)
+    printf("La variable %s a la valeur : %s\n",var,val);
+  else
+    printf("La variable %s n'a pas été assignée\n",var);
+}
+
+int main(int argc, char *argv[]) {
+
+  char *old_path=getenv("PATH");
+
+  print_var("PATH");
+
+  if(unsetenv("PATH")!=0) {
+    fprintf(stderr,"Erreur unsetenv\n");
+    exit(EXIT_FAILURE);
+  }
+
+  print_var("PATH");
+
+  if(setenv("PATH",old_path,1)!=0) {
+    fprintf(stderr,"Erreur setenv\n");
+    exit(EXIT_FAILURE);
+  }
+
+  print_var("PATH");
+
+  return(EXIT_SUCCESS);
+}
diff --git a/_static/src/C/S3-src/callocperf.c b/_static/src/C/S3-src/callocperf.c
new file mode 100644
index 0000000000000000000000000000000000000000..5707955a4e9a3bf6b30553bf121af6f107cd24ff
--- /dev/null
+++ b/_static/src/C/S3-src/callocperf.c
@@ -0,0 +1,39 @@
+/**************************************
+ * callocperf.c
+ *
+ * Programme mesurant les performances
+ * de calloc
+ *
+ **************************************/
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#define LOOP 2
+
+void error(char *msg) {
+  fprintf(stderr,"Erreur :%s\n",msg);
+  exit(EXIT_FAILURE);
+}
+
+int main(int argc, char *argv[]) {
+  int size=1;
+  if(argc==2)
+    size=atoi(argv[1]);
+
+  for(int j=1;j<LOOP+1;j++) {
+    int *vector;
+    vector=(int *)calloc(size,sizeof(int));
+
+    int count=0;
+    for(int i=0;i<size;i++) {
+      if( *(vector+i)!=0)
+	count++;
+      else
+	*(vector+i)=j;
+    }
+    printf("Nombre d'entiers non initialisés à zéro : %d\n",count);
+    free(vector);
+  }
+  return(EXIT_SUCCESS);
+}
diff --git a/_static/src/C/S3-src/const.c b/_static/src/C/S3-src/const.c
new file mode 100644
index 0000000000000000000000000000000000000000..ee0077524db848061a6294ec4a5dff3ebda2a0d6
--- /dev/null
+++ b/_static/src/C/S3-src/const.c
@@ -0,0 +1,29 @@
+/**************************************
+ * const.c
+ *
+ * Programme d'exemple de constantes
+ *
+ **************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+
+///AAA
+// extrait de <math.h>
+#define M_PI   3.14159265358979323846264338327950288;
+
+const double pi=3.14159265358979323846264338327950288;
+
+const struct fraction {
+  int num;
+  int denom;
+}  demi={1,2};
+///BBB
+int main(int argc, char *argv[]) {
+  // demi.num=0; invalid
+  printf("%d/%d\n",demi.num,demi.denom);
+  printf("Adresse de pi :%p\n",&pi);
+  printf("Adresse de demi :%p\n",&demi);
+
+  return(EXIT_SUCCESS);
+}
diff --git a/_static/src/C/S3-src/dataseg.c b/_static/src/C/S3-src/dataseg.c
new file mode 100644
index 0000000000000000000000000000000000000000..9f4cb34767e2ee3510068e0663ba3fed7ad98224
--- /dev/null
+++ b/_static/src/C/S3-src/dataseg.c
@@ -0,0 +1,32 @@
+/**************************************
+ * initvar.c
+ *
+ * Programme d'exemple sur le segment
+ * de données
+ *
+ **************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+
+///AAA
+#define MSG_LEN 10
+int g;   // initialisé par le compilateur
+int g_init=1252;
+const int un=1;
+int tab[3]={1,2,3};
+int array[10000];
+char cours[]="SINF1252";
+char msg[MSG_LEN]; // initialisé par le compilateur
+
+int main(int argc, char *argv[]) {
+  int i;
+  printf("g est à l'adresse %p et initialisée à %d\n",&g,g);
+  printf("msg est à l'adresse %p contient les caractères :",msg);
+  for(i=0;i<MSG_LEN;i++)
+    printf(" %x",msg[i]);
+  printf("\n");
+  printf("Cours est à l'adresse %p et contient : %s\n",&cours,cours);
+  return(EXIT_SUCCESS);
+}
+///BBB
diff --git a/_static/src/C/S3-src/dataseg.out b/_static/src/C/S3-src/dataseg.out
new file mode 100644
index 0000000000000000000000000000000000000000..9a372e29ce61182f94e9cfcc47b7500e46f0b880
--- /dev/null
+++ b/_static/src/C/S3-src/dataseg.out
@@ -0,0 +1,3 @@
+g est à l'adresse 0x60aeac et initialisée à 0
+msg est à l'adresse 0x60aea0 contient les caractères : 0 0 0 0 0 0 0 0 0 0
+Cours est à l'adresse 0x601220 et contient : SINF1252
diff --git a/_static/src/C/S3-src/empty.c b/_static/src/C/S3-src/empty.c
new file mode 100644
index 0000000000000000000000000000000000000000..80fa49285f10109c0d13737be89f09262169e13a
--- /dev/null
+++ b/_static/src/C/S3-src/empty.c
@@ -0,0 +1,17 @@
+/**************************************
+ * static.c
+ *
+ * Programme d'exemple de variables static
+éé
+ *
+ **************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+
+int main(int argc, char *argv[]) {
+   // affiche sur la sortie standard
+   printf("Hello, world!\n");
+
+   return(EXIT_SUCCESS);
+}
diff --git a/_static/src/C/S3-src/enum.c b/_static/src/C/S3-src/enum.c
new file mode 100644
index 0000000000000000000000000000000000000000..63b4776777d25f444678edb0609dd34aa7ff33f6
--- /dev/null
+++ b/_static/src/C/S3-src/enum.c
@@ -0,0 +1,44 @@
+/**************************************
+ * enum.c
+ *
+ * Programme d'exemple de enum
+ *
+ **************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+
+///AAA
+// les jours de la semaine
+typedef enum  {
+      monday, tuesday, wednesday, thursday, friday, saturday, sunday
+   } day;
+
+// jeu de carte
+typedef enum {
+  coeur, carreau, trefle, pique
+} carte;
+
+// bits
+typedef enum {
+        BITRESET = 0,
+        BITSET = 1
+} bit_t;
+
+///BBB
+
+
+int main(int argc, char *argv[]) {
+  ///CCC
+  bit_t bit=BITRESET;
+  day jour=monday;
+  if(jour==saturday||jour==sunday)
+    printf("Congé\n");
+  ///DDD
+  printf("jour: %d\n",jour);
+  printf("sizeof(day) %ld\n",sizeof(day));
+  printf("sizeof(bit_t) %ld\n",sizeof(bit_t));
+
+
+  return(EXIT_SUCCESS);
+}
diff --git a/_static/src/C/S3-src/exhaust-stack.c b/_static/src/C/S3-src/exhaust-stack.c
new file mode 100644
index 0000000000000000000000000000000000000000..c177bd4f88473ce2a61aa0c784f8cd4e61423936
--- /dev/null
+++ b/_static/src/C/S3-src/exhaust-stack.c
@@ -0,0 +1,47 @@
+/**************************************
+ * exhaust-stack.c
+ *
+ * Programme qui sature le stack
+ *
+ **************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/resource.h>
+
+///AAA
+
+#define ARRAY_SIZE 10000
+
+int sumn(int i) {
+  int array[ARRAY_SIZE];
+  printf("Computing sumn(%d)\n",i);
+  for(int j=0;j<ARRAY_SIZE;j++){
+    array[j]=i;
+  }
+  if(i>0)
+    return (i+sumn(i-1));
+  else
+    return i;
+}
+
+///BBB
+int main(int argc, char *argv[]) {
+  int n;
+  if(argc==2) {
+    n=atoi(argv[1]);
+  }
+  else
+    n=5;
+  struct rlimit r;
+
+  int err=getrlimit(RLIMIT_STACK,&r);
+  if(err!=0) {
+    printf("Error\n");
+    return(EXIT_FAILURE);
+  }
+  printf("Softlimit %ld, hard limit %ld\n",(rlim_t) r.rlim_cur,(rlim_t)r.rlim_max);
+  printf("La somme des %d premiers entiers est : %d\n",n,sumn(n));
+
+  return(EXIT_SUCCESS);
+}
diff --git a/_static/src/C/S3-src/fact.c b/_static/src/C/S3-src/fact.c
new file mode 100644
index 0000000000000000000000000000000000000000..2ea01e9c3c44e7fa686d140e4029bbc9c7f000fd
--- /dev/null
+++ b/_static/src/C/S3-src/fact.c
@@ -0,0 +1,82 @@
+/**************************************
+ * fact.c
+ *
+ * Programme de calcul de factorielle
+ *
+ **************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+///BBB
+// retourne i*j
+int times(int i, int j) {
+  int m;
+  m=i*j;
+  printf("\t[times(%d,%d)] : return(%d)\n",i,j,m);
+  return m;
+}
+// calcul récursif de factorielle
+// n>0
+int fact(int n) {
+  printf("[fact(%d)]: Valeur de n:%d, adresse: %p\n",n,n,&n);
+  int f;
+  if(n==1) {
+    printf("[fact(%d)]: return(1)\n",n);
+    return(n);
+  }
+  printf("[fact(%d)]: appel à fact(%d)\n",n,n-1);
+  f=fact(n-1);
+  printf("[fact(%d)]: calcul de times(%d,%d)\n",n,n,f);
+  f=times(n,f);
+  printf("[fact(%d)]: return(%d)\n",n,f);
+  return(f);
+}
+
+void compute() {
+  int nombre=3;
+  int f;
+  printf("La fonction fact est à l'adresse : %p\n",fact);
+  printf("La fonction times est à l'adresse : %p\n",times);
+  printf("La variable nombre vaut %d et est à l'adresse %p\n",nombre,&nombre);
+  f=fact(nombre);
+  printf("La factorielle de %d vaut %d\n",nombre,f);
+}
+///AAA
+
+
+#define MSG_LEN 80
+char msg[MSG_LEN];
+float matrix1[4];
+float matrix3[2]={1.3,2.4};
+struct fraction {
+  float den;
+  float num;
+} fract;
+const int nombre=7;
+
+int max(int i, int j) {
+  if(i>j)
+    return(i);
+  else
+    return(j);
+}
+
+int main(int argc, char *argv[]) {
+
+  int f=1252; // variable locale
+
+  printf("La variable nombre est à l'adresse : %p\n",(void *) &nombre);
+  printf("Le tableau msg est à l'adresse : %p\n",(void *)msg);
+  printf("La variable locale f est à l'adresse : %p\n",(void *) &f);
+
+  printf("La fonction main est à l'adresse : %p\n",main);
+  printf("La fonction max est à l'adresse : %p\n",max);
+
+  /// ...
+  ///BBB
+  printf("///FACT\n");
+  compute();
+
+  return(EXIT_SUCCESS);
+}
+
diff --git a/_static/src/C/S3-src/fact.out b/_static/src/C/S3-src/fact.out
new file mode 100644
index 0000000000000000000000000000000000000000..c2698ff8d11222fd32a4b8b1c39b581a87a69a6e
--- /dev/null
+++ b/_static/src/C/S3-src/fact.out
@@ -0,0 +1,22 @@
+La variable nombre est à l'adresse : 0x100000e68
+Le tableau msg est à l'adresse : 0x1000010a0
+La variable locale f est à l'adresse : 0x7fff5fbfe1dc
+La fonction main est à l'adresse : 0x100000b6b
+La fonction max est à l'adresse : 0x100000b46
+///FACT
+La fonction fact est à l'adresse : 0x100000a0f
+La fonction times est à l'adresse : 0x1000009d8
+La variable nombre vaut 3 et est à l'adresse 0x7fff5fbfe1ac
+[fact(3)]: Valeur de n:3, adresse: 0x7fff5fbfe17c
+[fact(3)]: appel à fact(2)
+[fact(2)]: Valeur de n:2, adresse: 0x7fff5fbfe14c
+[fact(2)]: appel à fact(1)
+[fact(1)]: Valeur de n:1, adresse: 0x7fff5fbfe11c
+[fact(1)]: return(1)
+[fact(2)]: calcul de times(2,1)
+	[times(2,1)] : return(2)
+[fact(2)]: return(2)
+[fact(3)]: calcul de times(3,2)
+	[times(3,2)] : return(6)
+[fact(3)]: return(6)
+La factorielle de 3 vaut 6
diff --git a/_static/src/C/S3-src/getpid.c b/_static/src/C/S3-src/getpid.c
new file mode 100644
index 0000000000000000000000000000000000000000..916a5945629a6a9a86c87c49430054703d7612aa
--- /dev/null
+++ b/_static/src/C/S3-src/getpid.c
@@ -0,0 +1,28 @@
+/**************************************
+ * getpid.c
+ *
+ * Programme d'exemple pour getpid
+ *
+ **************************************/
+///AAA
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+int main(int argc, char *argv[]) {
+
+  unsigned int sec=30;
+  int pid=(int) getpid();
+
+  printf("Processus : %d\n",pid);
+  printf("[pid=%d] Sleep : %d secondes\n",pid, sec);
+  sec=sleep(sec);
+  if(sec==0) {
+    printf("[pid=%d] Fin du processus\n",pid );
+    return(EXIT_SUCCESS);
+  }
+  else {
+    printf("[pid=%d] Interrompu alors qu'il restait %d secondes\n",pid,sec);
+    return(EXIT_FAILURE);
+  }
+}
diff --git a/_static/src/C/S3-src/initvar.c b/_static/src/C/S3-src/initvar.c
new file mode 100644
index 0000000000000000000000000000000000000000..80d027c38be42f74e0b004414524dfb60afe2af5
--- /dev/null
+++ b/_static/src/C/S3-src/initvar.c
@@ -0,0 +1,50 @@
+/**************************************
+ * initvar.c
+ *
+ * Programme d'exemple sur l'initialisation
+ * des variables
+ *
+ **************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+
+///AAA
+
+#define ARRAY_SIZE 1000
+
+// initialise un tableau local
+void init(void) {
+  long a[ARRAY_SIZE];
+  for(int i=0;i<ARRAY_SIZE;i++) {
+    a[i]=i;
+  }
+}
+
+// retourne la somme des éléments
+// d'un tableau local
+long read(void) {
+  long b[ARRAY_SIZE];
+  long sum=0;
+  for(int i=0;i<ARRAY_SIZE;i++) {
+    sum+=b[i];
+  }
+  return sum;
+}
+
+
+///BBB
+int main(int argc, char *argv[]) {
+  unsigned int n=5;
+
+  if(argc==2) {
+    n=atoi(argv[1]);
+  }
+
+  ///CCC
+  printf("Résultat de read() avant init(): %ld\n",read());
+  init();
+  printf("Résultat de read() après init() : %ld\n",read());
+  ///DDD
+  return(EXIT_SUCCESS);
+}
diff --git a/_static/src/C/S3-src/initvar.out b/_static/src/C/S3-src/initvar.out
new file mode 100644
index 0000000000000000000000000000000000000000..c54a887c8ffc40c19e46a3545f4f8dbea7461dd3
--- /dev/null
+++ b/_static/src/C/S3-src/initvar.out
@@ -0,0 +1,2 @@
+Résultat de read() avant init(): 7392321044987950589
+Résultat de read() après init() : 499500
diff --git a/_static/src/C/S3-src/malloc.c b/_static/src/C/S3-src/malloc.c
new file mode 100644
index 0000000000000000000000000000000000000000..3474c744e2f24fa3c9c20641a48dcb1d8360125c
--- /dev/null
+++ b/_static/src/C/S3-src/malloc.c
@@ -0,0 +1,55 @@
+/**************************************
+ * malloc.c
+ *
+ * Programme illustrant malloc
+ *
+ **************************************/
+///AAA
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+
+typedef struct fraction {
+  int num;
+  int den;
+} Fraction;
+
+void error(char *msg) {
+  fprintf(stderr,"Erreur :%s\n",msg);
+  exit(EXIT_FAILURE);
+}
+
+int main(int argc, char *argv[]) {
+  int size=1;
+  if(argc==2)
+    size=atoi(argv[1]);
+
+  char * string;
+  printf("Valeur du pointeur string avant malloc : %p\n",string);
+  string=(char *) malloc((size+1)*sizeof(char));
+  if(string==NULL)
+    error("malloc(string)");
+
+  printf("Valeur du pointeur string après malloc : %p\n",string);
+  int *vector;
+  vector=(int *)malloc(size*sizeof(int));
+  if(vector==NULL)
+    error("malloc(vector)");
+
+  Fraction * fract_vect;
+  fract_vect=(Fraction *) malloc(size*sizeof(Fraction));
+  if(fract_vect==NULL)
+    error("malloc(fract_vect)");
+
+  free(string);
+  printf("Valeur du pointeur string après free   : %p\n",string);
+  string=NULL;
+  free(vector);
+  vector=NULL;
+  free(fract_vect);
+  fract_vect=NULL;
+
+  return(EXIT_SUCCESS);
+}
+///BBB
diff --git a/_static/src/C/S3-src/malloc.out b/_static/src/C/S3-src/malloc.out
new file mode 100644
index 0000000000000000000000000000000000000000..44c87d400d19e800815c1417e2ad5f8afbbc403a
--- /dev/null
+++ b/_static/src/C/S3-src/malloc.out
@@ -0,0 +1,3 @@
+Valeur du pointeur string avant malloc : 0x7fff5fbfe1d8
+Valeur du pointeur string après malloc : 0x100100080
+Valeur du pointeur string après free   : 0x100100080
diff --git a/_static/src/C/S3-src/mallocinit.c b/_static/src/C/S3-src/mallocinit.c
new file mode 100644
index 0000000000000000000000000000000000000000..645ac40c80d69e26f5942c925473770b2fa402cf
--- /dev/null
+++ b/_static/src/C/S3-src/mallocinit.c
@@ -0,0 +1,34 @@
+/**************************************
+ * mallocinit.c
+ *
+ * Malloc et les données non-initialisées
+ *
+ **************************************/
+#include <stdio.h>
+#include <stdlib.h>
+///AAA
+#define LEN 1024
+
+int main(int argc, char *argv[]) {
+
+  int *v1;
+  int *v2;
+  int sum=0;
+  v1=(int *)malloc(sizeof(int)*LEN);
+  for(int i=0;i<LEN;i++) {
+    sum+=*(v1+i);
+    *(v1+i)=1252;
+  }
+  printf("Somme des éléments de v1 : %d\n", sum);
+  sum=0;
+  free(v1);
+  v2=(int *)malloc(sizeof(int)*LEN);
+  for(int i=0;i<LEN;i++) {
+    sum+=*(v2+i);
+  }
+
+  printf("Somme des éléments de v2 : %d\n", sum);
+  free(v2);
+
+  return(EXIT_SUCCESS);
+}
diff --git a/_static/src/C/S3-src/mallocinit.out b/_static/src/C/S3-src/mallocinit.out
new file mode 100644
index 0000000000000000000000000000000000000000..14d3a6866425c4b8c15441d8a9126042e94fbf6b
--- /dev/null
+++ b/_static/src/C/S3-src/mallocinit.out
@@ -0,0 +1,2 @@
+Somme des éléments de v1 : 0
+Somme des éléments de v2 : 1282048
diff --git a/_static/src/C/S3-src/mallocperf.c b/_static/src/C/S3-src/mallocperf.c
new file mode 100644
index 0000000000000000000000000000000000000000..291a614ef74b22ed36ac4ce39e4e2165f3c58f13
--- /dev/null
+++ b/_static/src/C/S3-src/mallocperf.c
@@ -0,0 +1,57 @@
+/**************************************
+ * mallocperf.c
+ *
+ * Programme mesurant les performances
+ * de malloc
+ *
+ **************************************/
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/time.h>
+
+
+#define LOOP 10
+#define SIZE 1000000000
+
+void error(char *msg) {
+  fprintf(stderr,"Erreur :%s\n",msg);
+  exit(EXIT_FAILURE);
+}
+
+/* Return t2-t1 in microseconds */
+long timeval_diff(struct timeval *t2, struct timeval *t1)
+{
+  long diff = (t2->tv_usec + 1000000 * t2->tv_sec) - (t1->tv_usec + 1000000 * t1->tv_sec);
+  return (diff);
+}
+
+int main(int argc, char *argv[]) {
+
+  int *vector;
+  long mesures[LOOP], sum;
+
+  struct timeval tvStart, tvEnd;
+  int err;
+
+  vector=(int *)malloc(SIZE*sizeof(int));
+  free(vector);
+
+  for(int i=0;i<LOOP+1;i++) {
+    err=gettimeofday(&tvStart, NULL);
+    if(err!=0)
+      exit(EXIT_FAILURE);
+
+     vector=(int *)calloc(SIZE,sizeof(int));
+     //vector=(int *)malloc(SIZE*sizeof(int));
+    err=gettimeofday(&tvEnd, NULL);
+    if(err!=0)
+      exit(EXIT_FAILURE);
+
+    mesures[i]=timeval_diff(&tvEnd, &tvStart);
+    sum+=mesures[i];
+    free(vector);
+  }
+  printf("Durée moyenne : %ld\n",sum/LOOP);
+
+  return(EXIT_SUCCESS);
+}
diff --git a/_static/src/C/S3-src/nofree.c b/_static/src/C/S3-src/nofree.c
new file mode 100644
index 0000000000000000000000000000000000000000..2308e6dd424ae16df84572eca4b4d8a880881c81
--- /dev/null
+++ b/_static/src/C/S3-src/nofree.c
@@ -0,0 +1,21 @@
+/**************************************
+ * nofree.c
+ *
+ * malloc sans free
+ *
+ **************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+///AAA
+#define LEN 1024
+int main(int argc, char *argv[]) {
+
+  char *str=(char *) malloc(sizeof(char)*LEN);
+  for(int i=0;i<LEN-1;i++) {
+    *(str+i)='A';
+  }
+  *(str+LEN)='\0';  // fin de chaîne
+  return(EXIT_SUCCESS);
+}
+
diff --git a/_static/src/C/S3-src/portee.c b/_static/src/C/S3-src/portee.c
new file mode 100644
index 0000000000000000000000000000000000000000..12ed7d94290b12b052c4e85cb7aa191cce5f3bbd
--- /dev/null
+++ b/_static/src/C/S3-src/portee.c
@@ -0,0 +1,62 @@
+/**************************************
+ * portee.c
+ *
+ * Programme d'exemple pour la portée de
+ * variables
+ **************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+
+///AAA
+
+int g1;
+int g2=1;
+
+void f(int i) {
+  int loc;    //def1a
+  int loc2=2; //def2a
+  int g2=-i*i;
+  g1++;
+
+  printf("[f-%da] \t\t %d \t %d \t %d \t %d\n",i,g1,g2,loc,loc2);
+  loc=i*i;
+  g1++;
+  g2++;
+  printf("[f-%db] \t\t %d \t %d \t %d \t %d\n",i,g1,g2,loc,loc2);
+
+}
+
+
+int main(int argc, char *argv[]) {
+  int loc; //def1b
+  int loc2=1; //def2b
+
+  printf("Valeurs de : \t g1 \t g2\t loc\t loc2\n");
+  printf("===================================================\n");
+
+  printf("[main1] \t %d \t %d \t %d \t %d\n",g1,g2,loc,loc2);
+
+  loc=1252;
+  loc2=1234;
+  g1=g1+1;
+  g1=g1+2;
+
+  printf("[main2] \t %d \t %d \t %d \t %d\n",g1,g2,loc,loc2);
+
+  for(int i=1;i<3;i++) {
+    int loc=i; //def1c
+    int g2=-i;
+    loc++;
+    g1=g1*2;
+    f(i);
+    printf("[main-for-%d] \t %d \t %d \t %d \t %d\n",i,g1,g2,loc,loc2);
+  }
+  f(7);
+  g1=g1*3;
+  g2=g2+2;
+  printf("[main3] \t %d \t %d \t %d \t %d\n",g1,g2,loc,loc2);
+
+  return(EXIT_SUCCESS);
+}
+///BBB
diff --git a/_static/src/C/S3-src/portee.out b/_static/src/C/S3-src/portee.out
new file mode 100644
index 0000000000000000000000000000000000000000..c2034d21514472921f1e95e0288e6fdf51c620f2
--- /dev/null
+++ b/_static/src/C/S3-src/portee.out
@@ -0,0 +1,13 @@
+Valeurs de : 	 g1 	 g2	 loc	 loc2
+===================================================
+[main1] 	 0 	 1 	 0 	 1
+[main2] 	 3 	 1 	 1252 	 1234
+[f-1a] 		 7 	 -1 	 0 	 2
+[f-1b] 		 8 	 0 	 1 	 2
+[main-for-1] 	 8 	 -1 	 2 	 1234
+[f-2a] 		 17 	 -4 	 0 	 2
+[f-2b] 		 18 	 -3 	 4 	 2
+[main-for-2] 	 18 	 -2 	 3 	 1234
+[f-7a] 		 19 	 -49 	 0 	 2
+[f-7b] 		 20 	 -48 	 49 	 2
+[main3] 	 60 	 3 	 1252 	 1234
diff --git a/_static/src/C/S3-src/stack.c b/_static/src/C/S3-src/stack.c
new file mode 100644
index 0000000000000000000000000000000000000000..db62dc7800b84962af464eca7bd6d491785f0bfb
--- /dev/null
+++ b/_static/src/C/S3-src/stack.c
@@ -0,0 +1,96 @@
+/**************************************
+ * stack.c
+ *
+ * Programme d'exemple implémentant un stack comme structure
+ * chaînée
+ *
+ **************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+
+typedef struct fraction_t {
+  int num;
+  int den;
+} fraction;
+
+///AAA
+typedef struct node_t
+{
+  struct fraction_t *data;
+  struct node_t *next;
+} node;
+
+struct node_t *stack; // sommet de la pile
+
+// ajoute un élément au sommet de la pile
+void push(struct fraction_t *f)
+{
+  struct node_t *n;
+  n=(struct node_t *)malloc(sizeof(struct node_t));
+  if(n==NULL)
+    exit(EXIT_FAILURE);
+  n->data = f;
+  n->next = stack;
+  stack = n;
+}
+// retire l'élément au sommet de la pile
+struct fraction_t * pop()
+{
+  if(stack==NULL)
+    return NULL;
+  // else
+  struct fraction_t *r;
+  struct node_t *removed=stack;
+  r=stack->data;
+  stack=stack->next;
+  free(removed);
+  return (r);
+}
+
+///BBB
+
+// affiche le contenu de la pile
+void display()
+{
+  struct node_t *t;
+  t = stack;
+  while(t!=NULL) {
+    if(t->data!=NULL) {
+      printf("Item at addr %p  :  Fraction %d/%d   Next %p\n",t,t->data->num,t->data->den,t->next);
+    }
+    else {
+      printf("Bas du stack %p\n",t);
+    }
+    t=t->next;
+  }
+}
+
+// exemple
+int main(int argc, char *argv[]) {
+
+  struct fraction_t demi={1,2};
+  struct fraction_t tiers={1,3};
+  struct fraction_t quart={1,4};
+  struct fraction_t zero={0,1};
+
+  // initialisation
+  stack = (struct node_t *)malloc(sizeof(struct node_t));
+  stack->next=NULL;
+  stack->data=NULL;
+
+  display();
+  push(&zero);
+  display();
+  push(&demi);
+  push(&tiers);
+  push(&quart);
+  display();
+
+  struct fraction_t *f=pop();
+  if(f!=NULL)
+    printf("Popped : %d/%d\n",f->num,f->den);
+
+  return(EXIT_SUCCESS);
+}
+///CCC
diff --git a/_static/src/C/S3-src/stack.out b/_static/src/C/S3-src/stack.out
new file mode 100644
index 0000000000000000000000000000000000000000..a3b08610b0c5642b458c409301b0bf3012021999
--- /dev/null
+++ b/_static/src/C/S3-src/stack.out
@@ -0,0 +1,9 @@
+Bas du stack 0x100100080
+Item at addr 0x100100090  :  Fraction 0/1   Next 0x100100080
+Bas du stack 0x100100080
+Item at addr 0x1001000c0  :  Fraction 1/4   Next 0x1001000b0
+Item at addr 0x1001000b0  :  Fraction 1/3   Next 0x1001000a0
+Item at addr 0x1001000a0  :  Fraction 1/2   Next 0x100100090
+Item at addr 0x100100090  :  Fraction 0/1   Next 0x100100080
+Bas du stack 0x100100080
+Popped : 1/4
diff --git a/_static/src/C/S3-src/static.c b/_static/src/C/S3-src/static.c
new file mode 100644
index 0000000000000000000000000000000000000000..5d369ef57c81805549e8d8c6d4ebcaf08d5ba7a0
--- /dev/null
+++ b/_static/src/C/S3-src/static.c
@@ -0,0 +1,24 @@
+/**************************************
+ * static.c
+ *
+ * Programme d'exemple d'utilisation de static
+ *
+ **************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+
+
+void f(int i) {
+  static int sum;
+
+}
+
+int main(int argc, char *argv[]) {
+
+  f(1);
+
+  f(2);
+
+  return(EXIT_SUCCESS);
+}
diff --git a/_static/src/C/S3-src/strcat.c b/_static/src/C/S3-src/strcat.c
new file mode 100644
index 0000000000000000000000000000000000000000..f1a785048b18706b070b983c04ccb3be8fcafd69
--- /dev/null
+++ b/_static/src/C/S3-src/strcat.c
@@ -0,0 +1,56 @@
+/**************************************
+ * concat.c
+ *
+ * Programme d'exemple pour concaténer
+ * deux chaînes de caractères
+ *
+ **************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#define SIZE 4
+
+int * init_vector(int length, int val) {
+  int *ret=malloc(length*sizeof(int));
+  for(int i=0;i<length;i++) {
+    *(ret+i)=val;
+  }
+  return(ret);
+}
+
+int *unit_matrix(int length) {
+  int *r=malloc(length*length*sizeof(int));
+  for(int i=0;i<length;i++) {
+    for(int j=0;j<length;j++) {
+      if(i==j) {
+	*(r+(i*length)+j)=1;
+      }
+      else {
+	*(r+(i*length)+j)=0;
+      }
+    }
+  }
+  return (r);
+}
+
+int main(int argc, char *argv[]) {
+  int *v;
+  int *m;
+  v=init_vector(SIZE,1252);
+  m=unit_matrix(SIZE);
+  for(int i=0;i<SIZE;i++) {
+    printf(" v[%d]=%d",i,*(v+i));
+  }
+  printf("\n");
+  for(int i=0;i<SIZE;i++) {
+    for(int j=0;j<SIZE;j++) {
+      printf(" m[%d,%d]=%d",i,j,*(m+(i*SIZE)+j));
+    }
+    printf("\n");
+  }
+  printf("\n");
+  free(v);
+  free(m);
+  return(EXIT_SUCCESS);
+}
diff --git a/_static/src/C/S3-src/strcpy.c b/_static/src/C/S3-src/strcpy.c
new file mode 100644
index 0000000000000000000000000000000000000000..c24c942b69aa6eb22145f49239beb62b5ce87d09
--- /dev/null
+++ b/_static/src/C/S3-src/strcpy.c
@@ -0,0 +1,46 @@
+/**************************************
+ * strcpy.c
+ *
+ * Programme d'exemple pour strcpy
+ *
+ **************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+///AAA
+#include <string.h>
+
+char *duplicate(char * str) {
+  int i;
+  size_t len=strlen(str);
+  char *ptr=(char *)malloc(sizeof(char)*(len+1));
+  if(ptr!=NULL) {
+    for(i=0;i<len+1;i++) {
+	*(ptr+i)=*(str+i);
+      }
+  }
+  return ptr;
+}
+///BBB
+char *duplicate2(char * str) {
+  int i;
+  size_t len=strlen(str);
+  char str2[len+1];
+  for(i=0;i<len+1;i++) {
+    str2[i]=*(str+i);
+  }
+  return str2;
+}
+///CCC
+
+int main(int argc, char *argv[]) {
+
+  char str[]="Hello, world";
+  char *str2=duplicate(str);
+  char *str3=duplicate2(str);
+  printf("str:  %s\n",str);
+  printf("str2: %s\n",str2);
+  printf("str3: %s\n",str3);
+
+  return(EXIT_SUCCESS);
+}
diff --git a/_static/src/C/S3-src/structargs.c b/_static/src/C/S3-src/structargs.c
new file mode 100644
index 0000000000000000000000000000000000000000..a8fc564afa05822c54ecdd3bd835a82989078485
--- /dev/null
+++ b/_static/src/C/S3-src/structargs.c
@@ -0,0 +1,72 @@
+/**************************************
+ * structargs.c
+ *
+ * exemple de structures comme arguments
+ *
+ **************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/time.h>
+
+
+/* Return t2-t1 in microseconds */
+long timeval_diff(struct timeval *t2, struct timeval *t1)
+{
+  long diff = (t2->tv_usec + 1000000 * t2->tv_sec) - (t1->tv_usec + 1000000 * t1->tv_sec);
+  return (diff);
+}
+
+///AAA
+
+#define MILLION 1000000
+
+struct large_t {
+  int i;
+  char str[MILLION];
+};
+
+int sum(struct large_t s1, struct large_t s2) {
+  return (s1.i+s2.i);
+}
+
+int sumptr(struct large_t *s1, struct large_t *s2) {
+  return (s1->i+s2->i);
+}
+
+int main(int argc, char *argv[]) {
+  struct timeval tvStart, tvEnd;
+  int err;
+  int n;
+  struct large_t one={1,"one"};
+  struct large_t two={1,"two"};
+
+  n=sum(one,two);
+  n=sumptr(&one,&two);
+
+///BBB
+
+  err=gettimeofday(&tvStart, NULL);
+  if(err!=0)
+    exit(EXIT_FAILURE);
+
+  err=sum(one,two);
+
+  err=gettimeofday(&tvEnd, NULL);
+  if(err!=0)
+    exit(EXIT_FAILURE);
+  printf("Durée de sum : %ld microsecondes\n",timeval_diff(&tvEnd, &tvStart));
+
+  err=gettimeofday(&tvStart, NULL);
+  if(err!=0)
+    exit(EXIT_FAILURE);
+
+  err=sumptr(&one,&two);
+
+  err=gettimeofday(&tvEnd, NULL);
+  if(err!=0)
+    exit(EXIT_FAILURE);
+
+  printf("Durée de sumptr : %ld microsecondes\n",timeval_diff(&tvEnd, &tvStart));
+}
+
diff --git a/_static/src/C/S3-src/typecast.c b/_static/src/C/S3-src/typecast.c
new file mode 100644
index 0000000000000000000000000000000000000000..5093e47386b25e7db546629d16b9c259fb8df5bb
--- /dev/null
+++ b/_static/src/C/S3-src/typecast.c
@@ -0,0 +1,26 @@
+/**************************************
+ * typecast.c
+ *
+ * Programme d'exemple de conversion entre
+ * types de données
+ *
+ **************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+
+int main(int argc, char *argv[]) {
+
+  ///AAA
+  int i=1;
+  float f=1e20;
+  double d=1e100;
+
+  printf("i [int]: %d, [float]:%f, [double]:%f\n",i,(float)i,(double)i);
+  printf("f [int]: %d, [float]:%f, [double]:%f\n",(int)f,f,(double)f);
+  printf("d [int]: %d, [float]:%f, [double]:%f\n",(int)d,(float)d,d);
+  printf("sizeof -> int:%d float:%d double:%d\n",(int)sizeof(int), (int)sizeof(float), (int)sizeof(double));
+
+  ///BBB
+   return(EXIT_SUCCESS);
+}
diff --git a/_static/src/C/S3-src/union.c b/_static/src/C/S3-src/union.c
new file mode 100644
index 0000000000000000000000000000000000000000..9951e915f6ebacea9cfa148363eaf283030175d5
--- /dev/null
+++ b/_static/src/C/S3-src/union.c
@@ -0,0 +1,61 @@
+/**************************************
+ * union.c
+ *
+ * Programme d'exemple de union
+ *
+ **************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+
+///AAA
+
+struct s_t {
+  int i;
+  char c;
+} s;
+
+union u_t {
+  int i;
+  char c;
+} u;
+
+///BBB
+
+typedef enum { INTEGER, CHAR } Type;
+
+typedef struct
+{
+  Type type;
+  union {
+  int i;
+  char c;
+  } x;
+} Value;
+
+
+///XXX
+
+int main(int argc, char *argv[]) {
+  ///CCC
+  // initialisation
+  s.i=1252;
+  s.c='A';
+  u.i=1252;
+  // u contient un int
+  u.c='Z';
+  // u contient maintenant un char (et u.i est perdu)
+  ///DDD
+  printf("sizeof(s_t) : %ld\n",sizeof(s));
+  printf("sizeof(u_t) : %ld\n",sizeof(u));
+  ///EEE
+  u.i=1252;
+  printf("char : %c\n", u.c);
+
+  ///FFF
+Value v;
+v.type=INTEGER;
+v.x.i=1252;
+///GGG
+  return(EXIT_SUCCESS);
+}
diff --git a/_static/src/C/S3-src/var.c b/_static/src/C/S3-src/var.c
new file mode 100644
index 0000000000000000000000000000000000000000..4ce1462aa121293a39baf57f087a6dca78b42b75
--- /dev/null
+++ b/_static/src/C/S3-src/var.c
@@ -0,0 +1,17 @@
+/**************************************
+ * var.c
+ *
+ * Programme d'exemple pour localiser
+ * les variables en mémoire
+ *
+ **************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+
+int main(int argc, char *argv[]) {
+   // affiche sur la sortie standard
+   printf("Hello, world!\n");
+
+   return(EXIT_SUCCESS);
+}
diff --git a/_static/src/C/S3-src/vector.c b/_static/src/C/S3-src/vector.c
new file mode 100644
index 0000000000000000000000000000000000000000..d41579c3e55a0bac3702941e812cefdedb5039e6
--- /dev/null
+++ b/_static/src/C/S3-src/vector.c
@@ -0,0 +1,59 @@
+/**************************************
+ * vector.c
+ *
+ * Programme de manipulation de vecteurs
+ *
+ **************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+///AAA
+struct vector_t {
+  int size;
+  float *v;
+};
+// initialise le vecteur à la valeur du réel
+struct vector_t * init(int, float) ;
+// récupère le nième élément
+float get(struct vector_t *, int) ;
+// fixe la valeur du nième élément
+void set(struct vector_t *, int , float);
+// supprime un vecteur
+void destroy(struct vector_t *);
+
+///BBB
+struct vector_t * init(int size, float val)
+{
+  struct vector_t *v=(struct vector_t *)malloc(sizeof(struct vector_t));
+  v->v=(float *)malloc(size*sizeof(float));
+  v->size=size;
+  for(int i=0;i<size;i++) {
+    *(v->v+i)=val;
+  }
+  return v;
+}
+
+float get(struct vector_t *v, int i) {
+  return *(v->v+i);
+}
+
+void set(struct vector_t *v, int i, float val) {
+  if(i<v->size)
+    *(v->v+i)=val;
+}
+
+void destroy(struct vector_t *v) {
+  free(v->v);
+  free(v);
+}
+
+int main(int argc, char *argv[]) {
+
+  struct vector_t *v1=init(10,2.0);
+  printf("v1[%d]=%f\n",3,get(v1,3));
+  set(v1,3,17.0);
+  printf("v1[%d]=%f\n",3,get(v1,3));
+  destroy(v1);
+
+   return(EXIT_SUCCESS);
+}
diff --git a/_static/src/C/S5-src/Makefile2 b/_static/src/C/S5-src/Makefile2
new file mode 100644
index 0000000000000000000000000000000000000000..9f43fcadd9455f1b955e8f59c63e7fa3d8ce9244
--- /dev/null
+++ b/_static/src/C/S5-src/Makefile2
@@ -0,0 +1,21 @@
+#
+# Makefile for source code
+#
+# Builds all .c files, assuming they are all independant and runs them
+# to collect the output on stdout
+#
+# Automatically builds some of the examples to be included in the text
+#
+
+###AAA
+
+myprog: main.o min.o
+	gcc -std=c99 -o myprog main.o min.o
+
+main.o: main.c min.h
+	gcc -std=c99 -c main.c
+
+min.o: min.c min.h
+	gcc -std=c99 -c min.c
+
+###BBB
diff --git a/_static/src/C/S5-src/errno.c b/_static/src/C/S5-src/errno.c
new file mode 100644
index 0000000000000000000000000000000000000000..4c0a4ec790bb622f03dfdb9a0714063f065c1950
--- /dev/null
+++ b/_static/src/C/S5-src/errno.c
@@ -0,0 +1,24 @@
+/**************************************
+ * errno.c
+ *
+ * Programme d'exemple pour errno
+ *
+ **************************************/
+///AAA
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+int main(int argc, char *argv[]) {
+
+  if(setenv(NULL,NULL,1)!=0) {
+    fprintf(stderr,"Erreur : errno=%d %s\n",errno,strerror(errno));
+  }
+  if(setenv("PATH=","/usr/bin",1)!=0) {
+    fprintf(stderr,"Erreur : errno=%d %s\n",errno,strerror(errno));
+   }
+
+
+}
+
diff --git a/_static/src/C/S5-src/fctptr.c b/_static/src/C/S5-src/fctptr.c
new file mode 100644
index 0000000000000000000000000000000000000000..c9b68d53b0d4231dd3e6f9348b13263c5ed3c031
--- /dev/null
+++ b/_static/src/C/S5-src/fctptr.c
@@ -0,0 +1,45 @@
+/**************************************
+ * fctptr.c
+ *
+ * Programme d'exemple pour les pointeurs
+ * vers des fonctions
+ *
+ **************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+///AAA
+int g=1;
+int debug_level;
+
+void empty (char *str) {
+  return;
+}
+
+void oneline(char *str) {
+  fprintf(stderr,"debug: %s\n",str);
+}
+
+void detailed(char *str) {
+  fprintf(stderr, "debug: %s\n",str);
+  fprintf(stderr,"g=%d\n",g);
+}
+
+void (* debug_print[])(char *) = { empty,
+				   oneline,
+				   detailed };
+
+int main(int argc, char *argv[]) {
+
+  if(argc!=2)
+    return(EXIT_FAILURE);
+
+  debug_level=atoi(argv[1]);
+  if((debug_level<0) || (debug_level>2) )
+    return(EXIT_FAILURE);
+  printf("fct debug_print : %p\n",debug_print[debug_level]);
+  (debug_print[debug_level])("Hello");
+
+   return(EXIT_SUCCESS);
+}
+///BBB
diff --git a/_static/src/C/S5-src/main.c b/_static/src/C/S5-src/main.c
new file mode 100644
index 0000000000000000000000000000000000000000..01130f8a563511b4851a98873a0e95f937025024
--- /dev/null
+++ b/_static/src/C/S5-src/main.c
@@ -0,0 +1,18 @@
+/**************************************
+ * main.c
+ *
+ * Programme d'exemple pour le linker
+ *
+ **************************************/
+
+#include "min.h"
+#include <stdio.h>
+#include <stdlib.h>
+
+int main(int argc, char *argv[]) {
+  float f1=3.45;
+  float f2=-4.12;
+  printf("Minimum(%f,%f)=%f\n",f1,f2,min(f1,f2));
+  return(EXIT_SUCCESS);
+}
+
diff --git a/_static/src/C/S5-src/min.c b/_static/src/C/S5-src/min.c
new file mode 100644
index 0000000000000000000000000000000000000000..1a0c53f81b43a18e0c0be95f386570b256c0cfef
--- /dev/null
+++ b/_static/src/C/S5-src/min.c
@@ -0,0 +1,17 @@
+/**************************************
+ * min.c
+ *
+ * Programme d'exemple pour le linker
+ *
+ **************************************/
+
+#include "min.h"
+
+float min(float a, float b) {
+  if(a<b)
+    return a;
+  else
+    return b;
+}
+
+
diff --git a/_static/src/C/S5-src/min.h b/_static/src/C/S5-src/min.h
new file mode 100644
index 0000000000000000000000000000000000000000..7812a4fe350d83e1b36316adc991c0355efe4f25
--- /dev/null
+++ b/_static/src/C/S5-src/min.h
@@ -0,0 +1,13 @@
+/**************************************
+ * min.h
+ *
+ **************************************/
+
+#ifndef _MIN_H_
+#define _MIN_H_
+
+float min(float, float);
+
+#endif /* _MIN_H */
+
+
diff --git a/_static/src/C/S5-src/module.c b/_static/src/C/S5-src/module.c
new file mode 100644
index 0000000000000000000000000000000000000000..a8f6204ae63f555734b0d31f3fd6285b5915bad7
--- /dev/null
+++ b/_static/src/C/S5-src/module.c
@@ -0,0 +1,31 @@
+/**************************************
+ * module.c
+ *
+ **************************************/
+
+#include "module.h"
+
+static float min(float, float);
+
+int num1=0;  // accessible hors de module.c
+extern int num2; // définie dans un autre module
+static int num3=1252; // accessible uniquement dans ce module
+
+float vmin(int n, float *ptr) {
+  float *p=ptr;
+  float m=*ptr;
+  for(int i=1;i<n;i++) {
+    m=min(m,*p);
+    p++;
+  }
+  return m;
+}
+
+static float min(float a, float b) {
+  if(a<b)
+    return a;
+  else
+    return b;
+}
+
+
diff --git a/_static/src/C/S5-src/module.h b/_static/src/C/S5-src/module.h
new file mode 100644
index 0000000000000000000000000000000000000000..cbfdb4ccc758a6b2c35d734c86f61ec7ba6cb261
--- /dev/null
+++ b/_static/src/C/S5-src/module.h
@@ -0,0 +1,12 @@
+/**************************************
+ * module.h
+ *
+ **************************************/
+#ifndef _MODULE_H_
+#define _MODULE_H_
+
+float vmin(int, float *);
+
+#endif /* _MODULE_H */
+
+
diff --git a/_static/src/C/S5-src/mystrtol.c b/_static/src/C/S5-src/mystrtol.c
new file mode 100644
index 0000000000000000000000000000000000000000..3cfbfdc267ac23810a787a128d3110798f254138
--- /dev/null
+++ b/_static/src/C/S5-src/mystrtol.c
@@ -0,0 +1,46 @@
+/**************************************
+ * stresep.c
+ *
+ * Implementation partielle de strtol
+ *
+ **************************************/
+///AAA
+#include <stdlib.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <stdbool.h>
+
+int mystrtol(const char *restrict str,
+	     char **restrict endptr,
+	     int base) {
+
+  int val;
+  int i=0;
+  int err=false;
+  while(!err && *(str+i)!='\0')
+    {
+      if(!isdigit(*(str+i))) {
+	err=true;
+	*endptr=(char *)(str+i);
+      }
+      i++;
+    }
+  // ...
+  return val;
+}
+///BBB
+
+int main(int argc, char *argv[])
+{
+  char *p, *s;
+  long li;
+  s = "1252m";
+  li = mystrtol(s,&p,10);
+  if(p!=NULL) {
+    printf("Caractère erronné : %c\n",*p);
+      // p pointe vers le caractère en erreur
+  }
+  printf("Valeur convertie : %s -> %ld\n",s,li);
+  return(EXIT_SUCCESS);
+
+}
diff --git a/_static/src/C/S5-src/prog.c b/_static/src/C/S5-src/prog.c
new file mode 100644
index 0000000000000000000000000000000000000000..538d4f8a4b0aa521664f00e9169d11dd8fa3556d
--- /dev/null
+++ b/_static/src/C/S5-src/prog.c
@@ -0,0 +1,39 @@
+/**************************************
+ * prog
+ *
+ * Programme d'exemple pour le linker
+ *
+ **************************************/
+
+#include <stdlib.h>
+#include <stdio.h>
+///AAA
+#include "min.h"
+#include "module.h"
+
+#define SIZE 4
+
+extern int num1; // définie dans un autre module
+int num2=1252;   // accessible depuis un autre module
+static int num3=-1; // accessible uniquement dans ce module
+
+void f() {
+  static int n=0;
+  int loc=2;
+  if(n==0)
+    printf("n est à  l'adresse %p et loc à l'adresse %p\n",&n,&loc);
+  printf("f, n=%d\n",n);
+  n++;
+}
+
+int main(int argc, char* argv[]) {
+
+  float v[SIZE]={1.0, 3.4, -2.4, 9.9};
+  printf("Minimum: %f\n",vmin(SIZE,v));
+  f();
+  f();
+  printf("Minimum(0.0,1.1)=%f\n",min(0.0,1.1));
+  return(EXIT_SUCCESS);
+}
+
+
diff --git a/_static/src/C/S5-src/prog.out b/_static/src/C/S5-src/prog.out
new file mode 100644
index 0000000000000000000000000000000000000000..95f658621a9fdc78dda8a325d1a33dace5f76d29
--- /dev/null
+++ b/_static/src/C/S5-src/prog.out
@@ -0,0 +1,5 @@
+Minimum: -2.400000
+n est à  l'adresse 0x100001078 et loc à l'adresse 0x7fff5fbfe1cc
+f, n=0
+f, n=1
+Minimum(0.0,1.1)=0.000000
diff --git a/_static/src/C/S5-src/ptrptr.c b/_static/src/C/S5-src/ptrptr.c
new file mode 100644
index 0000000000000000000000000000000000000000..1044c2a914f7f8902b5257fd951ec34e529fbdd3
--- /dev/null
+++ b/_static/src/C/S5-src/ptrptr.c
@@ -0,0 +1,24 @@
+/**************************************
+ * ptrptr.c
+ *
+ * Programme d'exemple pour les pointeurs
+ * vers des pointeurs
+ *
+ **************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+///AAA
+int main(int argc, char **argv) {
+
+  char **p;
+  p=argv;
+  printf("Arguments :");
+  while(*p!=NULL) {
+    printf(" %s",*p);
+    p++;
+  }
+  printf("\n");
+  return(EXIT_SUCCESS);
+}
+///BBB
diff --git a/_static/src/C/S5-src/qsort.c b/_static/src/C/S5-src/qsort.c
new file mode 100644
index 0000000000000000000000000000000000000000..3e834bba35d90ebcebafc19a92e954a0e72d5723
--- /dev/null
+++ b/_static/src/C/S5-src/qsort.c
@@ -0,0 +1,41 @@
+/**************************************
+ * qosrt.c
+ *
+ * Programme d'exemple d'utilisation de qsort
+ *
+ **************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+///AAA
+#define SIZE 5
+double array[SIZE]= { 1.0, 7.32, -3.43, 8.7, 9.99 };
+
+void print_array() {
+  for(int i=0;i<SIZE;i++)
+    printf("array[i]:%f\n",array[i]);
+}
+
+int cmp(const void *ptr1, const void *ptr2) {
+  const double *a=ptr1;
+  const double *b=ptr2;
+  if(*a==*b)
+    return 0;
+  else
+    if(*a<*b)
+      return -1;
+    else
+      return +1;
+}
+
+int main(int argc, char *argv[]) {
+
+  printf("Avant qsort\n\n");
+  print_array();
+  qsort(array,SIZE,sizeof(double),cmp);
+  printf("Après qsort\n\n");
+  print_array();
+
+  return(EXIT_SUCCESS);
+}
+///BBB
diff --git a/_static/src/C/S5-src/strtol.c b/_static/src/C/S5-src/strtol.c
new file mode 100644
index 0000000000000000000000000000000000000000..b1755d6fa8bdd9d8dea44720458583bbe5539441
--- /dev/null
+++ b/_static/src/C/S5-src/strtol.c
@@ -0,0 +1,34 @@
+/**************************************
+ * strtol.c
+ *
+ * Programme d'exemple d'utilisation de strtol
+ *
+ **************************************/
+///AAA
+#include <stdlib.h>
+#include <stdio.h>
+
+int main(int argc, char *argv[]) {
+
+  char *p, *s;
+  long li;
+  s = "1252";
+  li = strtol(s,&p,10);
+  if(*p != '\0') {
+    printf("Caractère erronné : %c\n",*p);
+      // p pointe vers le caractère en erreur
+  }
+  printf("Valeur convertie : %s -> %ld\n",s,li);
+
+  s = "12m52";
+  li = strtol(s,&p,10);
+  if(*p != '\0') {
+    printf("Caractère erronné : %c\n",*p);
+  }
+  printf("Valeur convertie : %s -> %ld\n",s,li);
+
+  return(EXIT_SUCCESS);
+}
+
+
+
diff --git a/_static/src/C/S5-src/strtol.out b/_static/src/C/S5-src/strtol.out
new file mode 100644
index 0000000000000000000000000000000000000000..58f9b96802b3183d71b2b2296f9a86d2e9eb9026
--- /dev/null
+++ b/_static/src/C/S5-src/strtol.out
@@ -0,0 +1,3 @@
+Valeur convertie : 1252 -> 1252
+Caractère erronné : m
+Valeur convertie : 12m52 -> 12
diff --git a/_static/src/C/src/cmdline.c b/_static/src/C/src/cmdline.c
new file mode 100644
index 0000000000000000000000000000000000000000..9d9ec77ec8633c2c38cad7829629ae8fdcb674c5
--- /dev/null
+++ b/_static/src/C/src/cmdline.c
@@ -0,0 +1,19 @@
+/**************************************
+ * cmdline.c
+ *
+ * Programme affichant ses arguments
+ * sur la sortie standard
+ *
+ **************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+
+int main(int argc, char *argv[])
+{
+  int i;
+  printf("Ce programme a %d argument(s)\n", argc);
+  for (i = 0; i < argc; i++)
+    printf("argument[%d] : %s\n", i, argv[i]);
+  return EXIT_SUCCESS;
+}
diff --git a/_static/src/C/src/cmdline.out b/_static/src/C/src/cmdline.out
new file mode 100644
index 0000000000000000000000000000000000000000..a730fe9056a2951317464e3ea6da879f5cb1ee94
--- /dev/null
+++ b/_static/src/C/src/cmdline.out
@@ -0,0 +1,6 @@
+Ce programme a 5 argument(s)
+argument[0] : ./cmdline
+argument[1] : 1
+argument[2] : -list
+argument[3] : abcdef
+argument[4] : lepl1503
diff --git a/_static/src/C/src/failure.c b/_static/src/C/src/failure.c
new file mode 100644
index 0000000000000000000000000000000000000000..321885bf51dee70fcb61f2959e7145ea0da70476
--- /dev/null
+++ b/_static/src/C/src/failure.c
@@ -0,0 +1,13 @@
+/**************************************
+ * failure.c
+ *
+ * Programme minimal qui échoue toujours
+ *
+ **************************************/
+
+#include <stdlib.h>
+
+int main(int argc, char *argv[])
+{
+  return EXIT_FAILURE;
+}
diff --git a/_static/src/C/src/filterdigit.c b/_static/src/C/src/filterdigit.c
new file mode 100644
index 0000000000000000000000000000000000000000..f242bef2aacceec6c8fb990f213498cc434af4e3
--- /dev/null
+++ b/_static/src/C/src/filterdigit.c
@@ -0,0 +1,41 @@
+/**************************************
+ * filterdigit.c
+ *
+ * Programme qui extrait de l'entrée
+ * standard les caractères représentant
+ * des chiffres
+ **************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+
+// retourne vrai si c est un chiffre, faux sinon
+// exemple simplifié, voir isdigit dans la librarire standard
+// pour une solution complète 
+int digit(char c)
+{
+  return ((c >= '0') && (c <= '9'));
+}
+
+// affiche un message d'erreur
+void usage()
+{
+  fprintf(stderr, "Ce programme ne prend pas d'argument\n");
+  exit(EXIT_FAILURE);
+}
+
+int main(int argc, char *argv[])
+{
+  char c;
+
+  if (argc > 1)
+    usage();
+
+  while ((c = getchar()) != EOF) {
+    if (digit(c))
+	    putchar(c);
+  }
+  
+  return EXIT_SUCCESS;
+}
+
diff --git a/_static/src/C/src/hello.c b/_static/src/C/src/hello.c
new file mode 100644
index 0000000000000000000000000000000000000000..a616435889fe024f86372035270f10f245e443ef
--- /dev/null
+++ b/_static/src/C/src/hello.c
@@ -0,0 +1,18 @@
+/**************************************
+ * Hello.c
+ *
+ * Programme affichant sur la sortie
+ * standard le message "Hello, world!"
+ *
+ **************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+
+int main(int argc, char *argv[])
+{
+   // affiche sur la sortie standard
+   printf("Hello, world!\n");
+
+   return EXIT_SUCCESS;
+}
diff --git a/_static/src/C/src/printf.c b/_static/src/C/src/printf.c
new file mode 100644
index 0000000000000000000000000000000000000000..a10b63583210a468cb32cadf440af5192ef3eb1f
--- /dev/null
+++ b/_static/src/C/src/printf.c
@@ -0,0 +1,37 @@
+/**************************************
+ * printf.c
+ *
+ * Exemples d'utilisation de printfProgramme qui a réussi
+ *
+ **************************************/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <math.h>
+
+int main(int argc, char *argv[])
+{
+  ///AAA
+  
+  char weekday[] = "Monday";
+  char month[] = "April";
+  int day = 1;
+  int hour = 12;
+  int min = 42;
+  char str[] = "SINF1252";
+  int i;
+  
+  // affichage de la date et l'heure
+  printf("%s, %s %d, %d:%d\n", weekday, month, day, hour, min);
+  
+  // affichage de la valeur de PI
+  printf("PI = %f\n", 4 * atan(1.0));
+  
+  // affichage d'un caractère par ligne
+  for(i = 0; str[i] != '\0'; i++)
+    printf("%c\n", str[i]);
+    
+  ///BBB
+  
+  return EXIT_SUCCESS;
+}
diff --git a/_static/src/C/src/printf.out b/_static/src/C/src/printf.out
new file mode 100644
index 0000000000000000000000000000000000000000..437d3ce012156d21e130bce20f133026c7d0a59f
--- /dev/null
+++ b/_static/src/C/src/printf.out
@@ -0,0 +1,10 @@
+Monday, April 1, 12:42
+PI = 3.141593
+L
+E
+P
+L
+1
+5
+0
+3
diff --git a/_static/src/C/src/ptr_arith.c b/_static/src/C/src/ptr_arith.c
new file mode 100644
index 0000000000000000000000000000000000000000..a4fe502d3f8e3240fbda0ae56bc75c33d923fa66
--- /dev/null
+++ b/_static/src/C/src/ptr_arith.c
@@ -0,0 +1,46 @@
+// arithmétique des pointeurs
+
+#include <stdio.h>
+
+int main(int argc, char *argv[])
+{
+///AAA
+  
+#define SIZE 3
+unsigned int tab[3];
+tab[0] = 0x01020304;
+tab[1] = 0x05060708;
+tab[2] = 0x090A0B0C;
+
+///BBB
+
+///CCC
+  
+int i;
+for (i = 0; i < SIZE; i++) {
+  printf("%X est à l'adresse %p\n", tab[i], &(tab[i]));
+}
+
+///DDD
+
+///EEE
+  
+unsigned int* ptr = tab;
+for (i = 0; i < SIZE; i++) {
+  printf("%X est à l'adresse %p\n", *ptr, ptr);
+  ptr++;
+}
+
+///FFF
+
+///GGG
+  
+unsigned char* ptr_char = (unsigned char *) tab;
+printf("ptr_char contient %p\n", ptr_char);
+for (i = 0; i < SIZE + 1; i++) {
+  printf("%X est à l'adresse %p\n", *ptr_char, ptr_char);
+  ptr_char++;
+}
+
+///HHH
+}
diff --git a/_static/src/C/src/string.c b/_static/src/C/src/string.c
new file mode 100644
index 0000000000000000000000000000000000000000..7970ef7065d43a5a19c23e586b86e79cb248ced2
--- /dev/null
+++ b/_static/src/C/src/string.c
@@ -0,0 +1,26 @@
+/**************************************
+ * string.c
+ *
+ * Programme d'expemple avec les strings
+ *
+ **************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+
+int main(int argc, char *argv[])
+{
+  ///AAA
+  
+  char string[10];
+  string[0] = 'j';
+  string[1] = 'a';
+  string[2] = 'v';
+  string[3] = 'a';
+  string[4] = '\0';
+  printf("String : %s\n", string);
+  
+  ///BBB
+  
+  return EXIT_SUCCESS;
+}
diff --git a/_static/src/Fichiers/src/a.out b/_static/src/Fichiers/src/a.out
new file mode 100755
index 0000000000000000000000000000000000000000..ea06754ee6b3584cb6be4787d742ac2308f089cc
Binary files /dev/null and b/_static/src/Fichiers/src/a.out differ
diff --git a/_static/src/Fichiers/src/alarm.c b/_static/src/Fichiers/src/alarm.c
new file mode 100644
index 0000000000000000000000000000000000000000..07abd5a1bd1c2d72051687ffb1a13ea702802a07
--- /dev/null
+++ b/_static/src/Fichiers/src/alarm.c
@@ -0,0 +1,45 @@
+/**************************************
+ * alarm.c
+ *
+ * Programme d'exemple d'utilisation des
+ * signaux SIGUSR
+ *
+ *************************************/
+///AAA
+#include <stdio.h>
+#include <stdlib.h>
+#include <signal.h>
+#include <unistd.h>
+#include <stdbool.h>
+
+static void sig_handler(int);
+
+int main (int argc, char *argv[])  {
+  char c;
+  printf("Tapez return en moins de 5 secondes !\n");
+  fflush(stdout);
+  if(signal(SIGALRM,sig_handler)==SIG_ERR) {
+    perror("signal");
+    exit(EXIT_FAILURE);
+  }
+  // sigalrm interrompt les appels système
+  if(siginterrupt(SIGALRM,true)<0) {
+    perror("siginterrupt");
+    exit(EXIT_FAILURE);
+  }
+  alarm(5);
+  int r=read(STDIN_FILENO,&c,1);
+  if((r==1)&&(c=='\n')) {
+    alarm(0); // reset timer
+    printf("Gagné\n");
+    exit(EXIT_SUCCESS);
+  }
+  printf("Perdu !\n");
+  exit(EXIT_FAILURE);
+}
+
+static void sig_handler(int signum) {
+  // rien à faire, read sera interrompu
+}
+
+///BBB
diff --git a/_static/src/Fichiers/src/alarm.out b/_static/src/Fichiers/src/alarm.out
new file mode 100644
index 0000000000000000000000000000000000000000..33c2eb4e5e6a7ac8e3dfbd7acbd5ee37a08ec5a2
--- /dev/null
+++ b/_static/src/Fichiers/src/alarm.out
@@ -0,0 +1,2 @@
+Tapez return en moins de 5 secondes !
+Perdu !
diff --git a/_static/src/Fichiers/src/alarm2.c b/_static/src/Fichiers/src/alarm2.c
new file mode 100644
index 0000000000000000000000000000000000000000..4007cc6006e2eb8c9f5c0de95990cb3f1bef6db3
--- /dev/null
+++ b/_static/src/Fichiers/src/alarm2.c
@@ -0,0 +1,58 @@
+/**************************************
+ * alarm.c
+ *
+ * Programme d'exemple d'utilisation des
+ * signaux SIGUSR
+ *
+ *************************************/
+///AAA
+#include <stdio.h>
+#include <stdlib.h>
+#include <signal.h>
+#include <unistd.h>
+#include <stdbool.h>
+#include <setjmp.h>
+
+sigjmp_buf env;
+
+static void sig_handler(int);
+
+int main (int argc, char *argv[])  {
+  char c;
+  printf("Tapez return en moins de 5 secondes !\n");
+  fflush(stdout);
+  if(signal(SIGALRM,sig_handler)==SIG_ERR) {
+    perror("signal");
+    exit(EXIT_FAILURE);
+  }
+  // sigalrm interrompt les appels système
+  if(siginterrupt(SIGALRM,true)<0) {
+    perror("siginterrupt");
+    exit(EXIT_FAILURE);
+  }
+  int r=0;
+  if(sigsetjmp(env,1)==0) {
+    // sig_handler n'a pas encore été appelé
+    alarm(5);
+    r=read(STDIN_FILENO,&c,1);
+  }
+  else {
+    // sig_handler a déjà été exécuté
+    // le délai a déjà expiré, inutile de faire read
+  }
+  alarm(0); // arrêt du timer
+  if((r==1)&&(c=='\n')) {
+    printf("Gagné\n");
+    exit(EXIT_SUCCESS);
+  }
+  else {
+    printf("Perdu !\n");
+    exit(EXIT_FAILURE);
+  }
+}
+
+static void sig_handler(int signum) {
+  siglongjmp(env,1);
+}
+
+///BBB
diff --git a/_static/src/Fichiers/src/fork-pipe.c b/_static/src/Fichiers/src/fork-pipe.c
new file mode 100644
index 0000000000000000000000000000000000000000..7048b623e9925ce3da3fac9da29759ad78777d4a
--- /dev/null
+++ b/_static/src/Fichiers/src/fork-pipe.c
@@ -0,0 +1,80 @@
+/**************************************
+ * fork-pipe.c
+ *
+ * Programme d'exemple d'utilisation de
+ * pipe en combinaison avec fork
+ *
+ *************************************/
+///AAA
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/wait.h>
+#include <sys/types.h>
+#include <stdbool.h>
+
+void exit_on_error(char *s) {
+  perror(s);
+  exit(EXIT_FAILURE);
+}
+
+
+int main (int argc, char *argv[])  {
+  int status;
+  pid_t pid;
+  int fd[2];
+  int err;
+
+  if ( pipe(fd)==-1)
+    exit_on_error("pipe");
+
+  pid=fork();
+
+  if (pid==-1) {
+    // erreur à l'exécution de fork
+    exit_on_error("fork");
+  }
+  // pas d'erreur
+  if (pid==0) {
+    int count=0;
+    int finished=false;
+    int n;
+    // processus fils, lecture du pipe
+    if(close(fd[1])==-1)
+      exit_on_error("close");
+    while ( !finished) {
+      err=read(fd[0],(void *) &n,sizeof(int));
+      if(err==sizeof(int))
+	// entier reçu
+	count++;
+      else
+	if(err==0)
+	  // fin de fichier
+	  finished=true;
+	else
+	  exit_on_error("read");
+    }
+    if(close(fd[0])==-1)
+      exit_on_error("close");
+    printf("Reçu : %d entiers\n",count);
+    return(EXIT_SUCCESS);
+  }
+  else {
+    // processus père
+    if(close(fd[0])==-1)
+      exit_on_error("close");
+    for(int i=0;i<100000;i++) {
+      if(write(fd[1],(void *) &i,sizeof(int))==-1)
+	exit_on_error("write");
+    }
+    if( close(fd[1])==-1)
+      exit_on_error("close(fd[1])");
+
+    int fils=waitpid(pid,&status,0);
+    if(fils==-1) {
+      exit_on_error("wait");
+    }
+    // fils terminé correctement
+  }
+}
+///BBB
diff --git a/_static/src/Fichiers/src/longjmp.c b/_static/src/Fichiers/src/longjmp.c
new file mode 100644
index 0000000000000000000000000000000000000000..87cc0b1c0a8a0577ac5ca3a99d283ec3187fcd9b
--- /dev/null
+++ b/_static/src/Fichiers/src/longjmp.c
@@ -0,0 +1,36 @@
+/**************************************
+ * longjmp.c
+ *
+ * Programme d'exemple de longjmp
+ *
+ *************************************/
+///AAA
+#include <stdio.h>
+#include <stdlib.h>
+#include <setjmp.h>
+
+jmp_buf label;
+
+void f() {
+
+  printf("Début fonction f\n");
+  if(setjmp(label)==0) {
+    printf("Exécution normale\n");
+  }
+  else {
+    printf("Exécution après longjmp\n");
+  }
+}
+
+void g() {
+  printf("Début fonction g\n");
+  longjmp(label,1);
+  printf("Ne sera jamais affiché\n");
+}
+
+int main (int argc, char *argv[])  {
+  f();
+  g();
+  return(EXIT_SUCCESS);
+}
+///BBB
diff --git a/_static/src/Fichiers/src/longjmp.out b/_static/src/Fichiers/src/longjmp.out
new file mode 100644
index 0000000000000000000000000000000000000000..f551980e51fabcd08d9e155c96de7a13d1ba114b
--- /dev/null
+++ b/_static/src/Fichiers/src/longjmp.out
@@ -0,0 +1,4 @@
+Début fonction f
+Exécution normale
+Début fonction g
+Exécution après longjmp
diff --git a/_static/src/Fichiers/src/nkill.sh b/_static/src/Fichiers/src/nkill.sh
new file mode 100755
index 0000000000000000000000000000000000000000..2eccd5e9605ff593abefa50f969666497fbf982c
--- /dev/null
+++ b/_static/src/Fichiers/src/nkill.sh
@@ -0,0 +1,12 @@
+#!/bin/bash
+if [ $# -ne 2 ]
+then
+    echo "Usage: `basename $0` n pid"
+    exit 1
+fi
+n=$1
+pid=$2
+for (( c=1; c<=$n; c++ ))
+do
+    kill -s SIGUSR1 $pid
+done
diff --git a/_static/src/Fichiers/src/process-sem-after.c b/_static/src/Fichiers/src/process-sem-after.c
new file mode 100644
index 0000000000000000000000000000000000000000..06ebd160fba30ad04514b35f928fa1b0386b78ce
--- /dev/null
+++ b/_static/src/Fichiers/src/process-sem-after.c
@@ -0,0 +1,58 @@
+/**************************************
+ * process-sem-before.c
+ *
+ * Programme d'exemple de sémaphores nommés
+ * La fonction after ne peut s'exécuter
+ * qu'après la fonction before
+ **************************************/
+
+#include <pthread.h>
+#include <semaphore.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <fcntl.h>           /* For O_* constants */
+#include <sys/stat.h>        /* For mode constants */
+#include <sys/types.h>
+#include <unistd.h>
+
+void error(int err, char *msg) {
+  fprintf(stderr,"%s a retourné %d, message d'erreur : %s\n",msg,err,strerror(errno));
+  exit(EXIT_FAILURE);
+}
+
+
+///AAA
+
+sem_t *semaphore;
+
+void after() {
+  sem_wait(semaphore);
+  // do something
+  for(int j=0;j<1000000;j++) {
+  }
+  printf("after done, pid=%d\n",(int) getpid());
+}
+
+int main (int argc, char *argv[])  {
+  int err;
+
+  // semaphore a été créé par before
+  semaphore=sem_open("lsinf1252",0);
+  if(semaphore==SEM_FAILED) {
+      error(-1,"sem_open");
+  }
+  after();
+
+  err=sem_close(semaphore);
+  if(err!=0) {
+      error(err,"sem_close");
+  }
+  err=sem_unlink("lsinf1252");
+  if(err!=0) {
+      error(err,"sem_unlink");
+  }
+  return(EXIT_SUCCESS);
+}
+///BBB
diff --git a/_static/src/Fichiers/src/process-sem-before.c b/_static/src/Fichiers/src/process-sem-before.c
new file mode 100644
index 0000000000000000000000000000000000000000..1356eb8678aaa5ef6b413163832cd8ba7fa42511
--- /dev/null
+++ b/_static/src/Fichiers/src/process-sem-before.c
@@ -0,0 +1,56 @@
+/**************************************
+ * process-sem-before.c
+ *
+ * Programme d'exemple de sémaphores
+ * La fonction after ne peut s'exécuter
+ * qu'après la fonction before
+ **************************************/
+
+#include <pthread.h>
+#include <semaphore.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <unistd.h>
+#include <fcntl.h>           /* For O_* constants */
+#include <sys/stat.h>        /* For mode constants */
+#include <sys/types.h>
+
+
+void error(int err, char *msg) {
+  fprintf(stderr,"%s a retourné %d, message d'erreur : %s\n",msg,err,strerror(errno));
+  exit(EXIT_FAILURE);
+}
+
+
+///AAA
+
+sem_t *semaphore;
+
+void before() {
+  // do something
+  for(int j=0;j<1000000;j++) {
+  }
+  printf("before done, pid=%d\n",(int) getpid());
+  sem_post(semaphore);
+}
+
+
+int main (int argc, char *argv[])  {
+
+  int err;
+
+  semaphore=sem_open("lsinf1252",O_CREAT,S_IRUSR | S_IWUSR,0);
+  if(semaphore==SEM_FAILED) {
+    error(-1,"sem_open");
+  }
+  sleep(20);
+  before();
+  err=sem_close(semaphore);
+  if(err!=0) {
+      error(err,"sem_close");
+  }
+  return(EXIT_SUCCESS);
+}
+///BBB
diff --git a/_static/src/Fichiers/src/read.c b/_static/src/Fichiers/src/read.c
new file mode 100644
index 0000000000000000000000000000000000000000..b81b8e7d14e4247bc3fd803bf5e9358959c9f7e7
--- /dev/null
+++ b/_static/src/Fichiers/src/read.c
@@ -0,0 +1,90 @@
+/**************************************
+ * read.c
+ *
+ * Programme d'exemple d'utilisation de
+ * fichiers
+ *
+ *************************************/
+///AAA
+#include <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <string.h>
+
+void exit_on_error(char *s) {
+  perror(s);
+  exit(EXIT_FAILURE);
+}
+
+int main (int argc, char *argv[])  {
+  int n=1252;
+  int n2;
+  short ns=1252;
+  short ns2;
+  long nl=125212521252;
+  long nl2;
+  float f=12.52;
+  float f2;
+  char *s="sinf1252";
+  char *s2=(char *) malloc(strlen(s)*sizeof(char )+1);
+  int err;
+  int fd;
+
+  fd=open("test.dat",O_WRONLY|O_CREAT|O_TRUNC, S_IRUSR|S_IWUSR);
+  if(fd==-1) {
+    perror("open");
+    exit(EXIT_FAILURE);
+  }
+  if( write(fd, (void *) s, strlen(s)) == -1 )
+    exit_on_error("write s");
+  if (write(fd, (void *) &n, sizeof(int )) == -1)
+    exit_on_error("write n");
+  if (write(fd, (void *) &ns, sizeof(short int))==-1)
+    exit_on_error("write ns");
+  if (write(fd, (void *) &nl, sizeof(long int))==-1)
+    exit_on_error("write nl");
+  if (write(fd, (void *) &f, sizeof(float))==-1)
+    exit_on_error("write f");
+  if (close(fd)==-1)
+    exit_on_error("close ");
+
+  // lecture
+  fd=open("test.dat",O_RDONLY);
+  if(fd==-1) {
+    perror("open");
+    exit(EXIT_FAILURE);
+  }
+  printf("Fichier ouvert\n");
+
+  if(read(fd, (void *) s2, strlen(s))==-1)
+    exit_on_error("read s");
+  printf("Donnée écrite : %s, lue: %s\n",s,s2);
+
+  if(read(fd, (void *) &n2, sizeof(int))==-1)
+    exit_on_error("read n");
+  printf("Donnée écrite : %d, lue: %d\n",n,n2);
+
+  if(read(fd, (void *) &ns2, sizeof(short))==-1)
+    exit_on_error("read ns");
+  printf("Donnée écrite : %d, lue: %d\n",ns,ns2);
+
+  if(read(fd, (void *) &nl2, sizeof(long))==-1)
+    exit_on_error("read nl");
+  printf("Donnée écrite : %ld, lue: %ld\n",nl,nl2);
+
+  if(read(fd, (void *) &f2, sizeof(float))==-1)
+    exit_on_error("read f");
+  printf("Donnée écrite : %f, lue: %f\n",f,f2);
+  err=close(fd);
+  if(err==-1){
+   perror("close");
+    exit(EXIT_FAILURE);
+  }
+
+  return(EXIT_SUCCESS);
+}
+///BBB
diff --git a/_static/src/Fichiers/src/read.out b/_static/src/Fichiers/src/read.out
new file mode 100644
index 0000000000000000000000000000000000000000..752a113708158e8f68fa3cce793bf37bcf7d806a
--- /dev/null
+++ b/_static/src/Fichiers/src/read.out
@@ -0,0 +1,6 @@
+Fichier ouvert
+Donnée écrite : sinf1252, lue: sinf1252
+Donnée écrite : 1252, lue: 1252
+Donnée écrite : 1252, lue: 1252
+Donnée écrite : 125212521252, lue: 125212521252
+Donnée écrite : 12.520000, lue: 12.520000
diff --git a/_static/src/Fichiers/src/readdir.c b/_static/src/Fichiers/src/readdir.c
new file mode 100644
index 0000000000000000000000000000000000000000..0f6b7a01e1debd006d575627a50254017c2f2508
--- /dev/null
+++ b/_static/src/Fichiers/src/readdir.c
@@ -0,0 +1,38 @@
+/**************************************
+ * readdir.c
+ *
+ * Programme d'exemple d'utilisation de
+ * répertoires
+ *
+ *************************************/
+///AAA
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <dirent.h>
+
+void exit_on_error(char *s) {
+  perror(s);
+  exit(EXIT_FAILURE);
+}
+
+int main (int argc, char *argv[])  {
+
+  DIR *dirp;
+  struct dirent *dp;
+  char name[]=".";
+  dirp = opendir(name);
+  if(dirp==NULL) {
+    exit_on_error("opendir");
+  }
+  while ((dp = readdir(dirp)) != NULL) {
+    printf("%s\n",dp->d_name);
+  }
+  int err = closedir(dirp);
+  if(err<0) {
+    exit_on_error("closedir");
+  }
+
+
+}
+///BBB
diff --git a/_static/src/Fichiers/src/sigfpe.c b/_static/src/Fichiers/src/sigfpe.c
new file mode 100644
index 0000000000000000000000000000000000000000..eb296704d8b424ede768c1743bc3327d50670bdd
--- /dev/null
+++ b/_static/src/Fichiers/src/sigfpe.c
@@ -0,0 +1,21 @@
+/**************************************
+ * sigfpe.c
+ *
+ * Programme d'exemple de signal sigfpe
+ * fichiers
+ *
+ *************************************/
+///AAA
+#include <stdio.h>
+#include <stdlib.h>
+
+int main (int argc, char *argv[])  {
+  int n=1252;
+  int zero=0;
+  printf("Calcul de : %d/%d\n",n,zero);
+  fflush(stdout);
+  printf("Résultat : %d\n",n/zero);
+
+  return(EXIT_SUCCESS);
+}
+///BBB
diff --git a/_static/src/Fichiers/src/sigfpe2.c b/_static/src/Fichiers/src/sigfpe2.c
new file mode 100644
index 0000000000000000000000000000000000000000..d8d3468045809760847566e804a62f9c0796aef5
--- /dev/null
+++ b/_static/src/Fichiers/src/sigfpe2.c
@@ -0,0 +1,50 @@
+/**************************************
+ * sigfpe.c
+ *
+ * Programme d'exemple de signal sigfpe
+ * handler incorrect
+ *
+ *************************************/
+///AAA
+#include <stdio.h>
+#include <stdlib.h>
+#include <signal.h>
+#include <string.h>
+#include <unistd.h>
+
+static void sigfpe_handler(int);
+
+int main (int argc, char *argv[])  {
+
+  int n=1252;
+  void (*handler)(int);
+
+  handler=signal(SIGFPE,sigfpe_handler);
+  if(handler==SIG_ERR) {
+    perror("signal");
+    exit(EXIT_FAILURE);
+  }
+
+  for(int i=1;i<argc;i++) {
+    char *endptr;
+    printf("Traitement de argv[%d]=%s\n",i,argv[i]);
+    fflush(stdout);
+    long val=strtol(argv[i],&endptr,10);
+    if(*endptr=='\0') {
+      int resultat=n/(int) val;
+      printf("%d/%d=%d\n",n,(int) val,resultat);
+    }
+    else {
+      printf("Argument incorrect : %s\n",argv[i]);
+    }
+  }
+  return(EXIT_SUCCESS);
+}
+
+static void sigfpe_handler(int signum) {
+  char *msg="Signal SIGFPE reçu\n";
+  write(STDOUT_FILENO,msg,strlen(msg));
+
+}
+
+///BBB
diff --git a/_static/src/Fichiers/src/sigfpe3.c b/_static/src/Fichiers/src/sigfpe3.c
new file mode 100644
index 0000000000000000000000000000000000000000..671c55bb747b7243fc9e36d8a7ceb3ada5cd7d48
--- /dev/null
+++ b/_static/src/Fichiers/src/sigfpe3.c
@@ -0,0 +1,53 @@
+/**************************************
+ * sigfpe.c
+ *
+ * Programme d'exemple de signal sigfpe
+ * fichiers
+ *
+ *************************************/
+///AAA
+#include <stdio.h>
+#include <stdlib.h>
+#include <signal.h>
+#include <setjmp.h>
+
+sigjmp_buf buf;
+
+static void sigfpe_handler(int);
+
+int main (int argc, char *argv[])  {
+
+  int n=1252;
+  if(signal(SIGFPE,sigfpe_handler)==SIG_ERR) {
+    perror("signal");
+    exit(EXIT_FAILURE);
+  }
+
+  for(int i=1;i<argc;i++) {
+    char *endptr;
+    int r;
+    printf("Traitement de argv[%d]=%s\n",i,argv[i]);
+    long val=strtol(argv[i],&endptr,10);
+    if(*endptr=='\0') {
+      r=sigsetjmp(buf,1);
+      if(r==0) {
+	int resultat=n/(int) val;
+	printf("%d/%d=%d\n",n,(int) val,resultat);
+      }
+      else {
+	printf("%d/%d=NaN\n",n,(int) val);
+      }
+    }
+    else {
+      printf("Argument incorrect : %s\n",argv[i]);
+    }
+  }
+  return(EXIT_SUCCESS);
+}
+
+static void sigfpe_handler(int signum) {
+  // ignorer la donnée et passer à la suivante
+  siglongjmp(buf,1);
+}
+
+///BBB
diff --git a/_static/src/Fichiers/src/sigusr.c b/_static/src/Fichiers/src/sigusr.c
new file mode 100644
index 0000000000000000000000000000000000000000..466943279c4d2e672a36e2833b2ddd5035a20d67
--- /dev/null
+++ b/_static/src/Fichiers/src/sigusr.c
@@ -0,0 +1,59 @@
+/**************************************
+ * sigusr.c
+ *
+ * Programme d'exemple d'utilisation des
+ * signaux SIGUSR
+ *
+ *************************************/
+///AAA
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <signal.h>
+#include <unistd.h>
+#include <stdint.h>
+#include <stdio.h>
+
+volatile sig_atomic_t n_sigusr1=0;
+volatile sig_atomic_t n_sigusr2=0;
+
+static void sig_handler(int);
+
+int main (int argc, char *argv[])  {
+
+  if(signal(SIGUSR1,sig_handler)==SIG_ERR) {
+    perror("signal");
+    exit(EXIT_FAILURE);
+  }
+  if(signal(SIGUSR2,sig_handler)==SIG_ERR) {
+    perror("signal");
+    exit(EXIT_FAILURE);
+  }
+
+  while( (n_sigusr1+n_sigusr2) <5) {
+    // vide
+  }
+
+  printf("Fin du processus\n");
+  printf("Reçu %d SIGUSR1 et %d SIGUSR2\n",n_sigusr1,n_sigusr2);
+  return(EXIT_SUCCESS);
+}
+
+static void sig_handler(int signum) {
+
+  if(signum==SIGUSR1) {
+    n_sigusr1++;
+  }
+  else {
+    if(signum==SIGUSR2) {
+      n_sigusr2++;
+    }
+    else {
+      char *msg="Reçu signal inattendu\n";
+      write(STDERR_FILENO,msg,strlen(msg));
+      _exit(EXIT_FAILURE);
+    }
+  }
+}
+
+///BBB
diff --git a/_static/src/Fichiers/src/sigusrcount.c b/_static/src/Fichiers/src/sigusrcount.c
new file mode 100644
index 0000000000000000000000000000000000000000..ed0aacf0387488f30780f199a0cea620213ea2ff
--- /dev/null
+++ b/_static/src/Fichiers/src/sigusrcount.c
@@ -0,0 +1,41 @@
+/**************************************
+ * sigusrcount.c
+ *
+ * Programme d'exemple d'utilisation des
+ * signaux SIGUSR
+ *
+ *************************************/
+///AAA
+#include <stdio.h>
+#include <stdlib.h>
+#include <signal.h>
+#include <unistd.h>
+
+volatile sig_atomic_t n_sigusr1=0;
+
+static void sig_handler(int);
+
+int main (int argc, char *argv[])  {
+
+  if(signal(SIGUSR1,sig_handler)==SIG_ERR) {
+    perror("signal");
+    exit(EXIT_FAILURE);
+  }
+  int duree=60;
+  while(duree>0) {
+    printf("Exécution de sleep(%d)\n",duree);
+    duree=sleep(duree);
+  }
+  printf("Fin du processus\n");
+  printf("Reçu %d SIGUSR1\n",n_sigusr1);
+  return(EXIT_SUCCESS);
+}
+
+static void sig_handler(int signum) {
+
+  if(signum==SIGUSR1) {
+    n_sigusr1++;
+  }
+}
+
+///BBB
diff --git a/_static/src/Threads/S5-src/errno.c b/_static/src/Threads/S5-src/errno.c
new file mode 100644
index 0000000000000000000000000000000000000000..4c0a4ec790bb622f03dfdb9a0714063f065c1950
--- /dev/null
+++ b/_static/src/Threads/S5-src/errno.c
@@ -0,0 +1,24 @@
+/**************************************
+ * errno.c
+ *
+ * Programme d'exemple pour errno
+ *
+ **************************************/
+///AAA
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+int main(int argc, char *argv[]) {
+
+  if(setenv(NULL,NULL,1)!=0) {
+    fprintf(stderr,"Erreur : errno=%d %s\n",errno,strerror(errno));
+  }
+  if(setenv("PATH=","/usr/bin",1)!=0) {
+    fprintf(stderr,"Erreur : errno=%d %s\n",errno,strerror(errno));
+   }
+
+
+}
+
diff --git a/_static/src/Threads/S5-src/fctptr.c b/_static/src/Threads/S5-src/fctptr.c
new file mode 100644
index 0000000000000000000000000000000000000000..c9b68d53b0d4231dd3e6f9348b13263c5ed3c031
--- /dev/null
+++ b/_static/src/Threads/S5-src/fctptr.c
@@ -0,0 +1,45 @@
+/**************************************
+ * fctptr.c
+ *
+ * Programme d'exemple pour les pointeurs
+ * vers des fonctions
+ *
+ **************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+///AAA
+int g=1;
+int debug_level;
+
+void empty (char *str) {
+  return;
+}
+
+void oneline(char *str) {
+  fprintf(stderr,"debug: %s\n",str);
+}
+
+void detailed(char *str) {
+  fprintf(stderr, "debug: %s\n",str);
+  fprintf(stderr,"g=%d\n",g);
+}
+
+void (* debug_print[])(char *) = { empty,
+				   oneline,
+				   detailed };
+
+int main(int argc, char *argv[]) {
+
+  if(argc!=2)
+    return(EXIT_FAILURE);
+
+  debug_level=atoi(argv[1]);
+  if((debug_level<0) || (debug_level>2) )
+    return(EXIT_FAILURE);
+  printf("fct debug_print : %p\n",debug_print[debug_level]);
+  (debug_print[debug_level])("Hello");
+
+   return(EXIT_SUCCESS);
+}
+///BBB
diff --git a/_static/src/Threads/S5-src/main.c b/_static/src/Threads/S5-src/main.c
new file mode 100644
index 0000000000000000000000000000000000000000..01130f8a563511b4851a98873a0e95f937025024
--- /dev/null
+++ b/_static/src/Threads/S5-src/main.c
@@ -0,0 +1,18 @@
+/**************************************
+ * main.c
+ *
+ * Programme d'exemple pour le linker
+ *
+ **************************************/
+
+#include "min.h"
+#include <stdio.h>
+#include <stdlib.h>
+
+int main(int argc, char *argv[]) {
+  float f1=3.45;
+  float f2=-4.12;
+  printf("Minimum(%f,%f)=%f\n",f1,f2,min(f1,f2));
+  return(EXIT_SUCCESS);
+}
+
diff --git a/_static/src/Threads/S5-src/math.c b/_static/src/Threads/S5-src/math.c
new file mode 100644
index 0000000000000000000000000000000000000000..78da61797c921410ef305fbe67fd8ab747284f77
--- /dev/null
+++ b/_static/src/Threads/S5-src/math.c
@@ -0,0 +1,16 @@
+/**************************************
+ * min.c
+ *
+ * Programme d'exemple pour le linker
+ *
+ **************************************/
+
+#include <math.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+int main (int argc, char *argv[])  {
+  printf("Le cosinus de PI vaut : %f\n",cos(M_PI));
+  return(EXIT_SUCCESS);
+
+}
diff --git a/_static/src/Threads/S5-src/min-ex.c b/_static/src/Threads/S5-src/min-ex.c
new file mode 100644
index 0000000000000000000000000000000000000000..44712f5ae995c912657d9cf3b4b9cfb253f95a85
--- /dev/null
+++ b/_static/src/Threads/S5-src/min-ex.c
@@ -0,0 +1,24 @@
+/**************************************
+ * min-ex.c
+ *
+ * Programme d'exemple pour le linker
+ *
+ **************************************/
+
+#include "min.h"
+#include <stdlib.h>
+
+float min(float a, float b) {
+  if(a<b)
+    return a;
+  else
+    return b;
+}
+
+static int main(int argc, char*argv[]) {
+
+  if(min(3.0,2.0)!=2.0)
+    return(EXIT_FAILURE);
+
+}
+
diff --git a/_static/src/Threads/S5-src/min.c b/_static/src/Threads/S5-src/min.c
new file mode 100644
index 0000000000000000000000000000000000000000..1a0c53f81b43a18e0c0be95f386570b256c0cfef
--- /dev/null
+++ b/_static/src/Threads/S5-src/min.c
@@ -0,0 +1,17 @@
+/**************************************
+ * min.c
+ *
+ * Programme d'exemple pour le linker
+ *
+ **************************************/
+
+#include "min.h"
+
+float min(float a, float b) {
+  if(a<b)
+    return a;
+  else
+    return b;
+}
+
+
diff --git a/_static/src/Threads/S5-src/module.c b/_static/src/Threads/S5-src/module.c
new file mode 100644
index 0000000000000000000000000000000000000000..a8f6204ae63f555734b0d31f3fd6285b5915bad7
--- /dev/null
+++ b/_static/src/Threads/S5-src/module.c
@@ -0,0 +1,31 @@
+/**************************************
+ * module.c
+ *
+ **************************************/
+
+#include "module.h"
+
+static float min(float, float);
+
+int num1=0;  // accessible hors de module.c
+extern int num2; // définie dans un autre module
+static int num3=1252; // accessible uniquement dans ce module
+
+float vmin(int n, float *ptr) {
+  float *p=ptr;
+  float m=*ptr;
+  for(int i=1;i<n;i++) {
+    m=min(m,*p);
+    p++;
+  }
+  return m;
+}
+
+static float min(float a, float b) {
+  if(a<b)
+    return a;
+  else
+    return b;
+}
+
+
diff --git a/_static/src/Threads/S5-src/mystrtol.c b/_static/src/Threads/S5-src/mystrtol.c
new file mode 100644
index 0000000000000000000000000000000000000000..3cfbfdc267ac23810a787a128d3110798f254138
--- /dev/null
+++ b/_static/src/Threads/S5-src/mystrtol.c
@@ -0,0 +1,46 @@
+/**************************************
+ * stresep.c
+ *
+ * Implementation partielle de strtol
+ *
+ **************************************/
+///AAA
+#include <stdlib.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <stdbool.h>
+
+int mystrtol(const char *restrict str,
+	     char **restrict endptr,
+	     int base) {
+
+  int val;
+  int i=0;
+  int err=false;
+  while(!err && *(str+i)!='\0')
+    {
+      if(!isdigit(*(str+i))) {
+	err=true;
+	*endptr=(char *)(str+i);
+      }
+      i++;
+    }
+  // ...
+  return val;
+}
+///BBB
+
+int main(int argc, char *argv[])
+{
+  char *p, *s;
+  long li;
+  s = "1252m";
+  li = mystrtol(s,&p,10);
+  if(p!=NULL) {
+    printf("Caractère erronné : %c\n",*p);
+      // p pointe vers le caractère en erreur
+  }
+  printf("Valeur convertie : %s -> %ld\n",s,li);
+  return(EXIT_SUCCESS);
+
+}
diff --git a/_static/src/Threads/S5-src/prog.c b/_static/src/Threads/S5-src/prog.c
new file mode 100644
index 0000000000000000000000000000000000000000..538d4f8a4b0aa521664f00e9169d11dd8fa3556d
--- /dev/null
+++ b/_static/src/Threads/S5-src/prog.c
@@ -0,0 +1,39 @@
+/**************************************
+ * prog
+ *
+ * Programme d'exemple pour le linker
+ *
+ **************************************/
+
+#include <stdlib.h>
+#include <stdio.h>
+///AAA
+#include "min.h"
+#include "module.h"
+
+#define SIZE 4
+
+extern int num1; // définie dans un autre module
+int num2=1252;   // accessible depuis un autre module
+static int num3=-1; // accessible uniquement dans ce module
+
+void f() {
+  static int n=0;
+  int loc=2;
+  if(n==0)
+    printf("n est à  l'adresse %p et loc à l'adresse %p\n",&n,&loc);
+  printf("f, n=%d\n",n);
+  n++;
+}
+
+int main(int argc, char* argv[]) {
+
+  float v[SIZE]={1.0, 3.4, -2.4, 9.9};
+  printf("Minimum: %f\n",vmin(SIZE,v));
+  f();
+  f();
+  printf("Minimum(0.0,1.1)=%f\n",min(0.0,1.1));
+  return(EXIT_SUCCESS);
+}
+
+
diff --git a/_static/src/Threads/S5-src/pthread-args.c b/_static/src/Threads/S5-src/pthread-args.c
new file mode 100644
index 0000000000000000000000000000000000000000..6e4365501388aba19b8adbb30d4743524b46f371
--- /dev/null
+++ b/_static/src/Threads/S5-src/pthread-args.c
@@ -0,0 +1,88 @@
+/**************************************
+ * pthread-args.c
+ *
+ * Programme d'exemple de pthread utilisant les
+ * arguments et retournant une valeur
+ *
+ **************************************/
+
+#include <pthread.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+
+#define MAXNUM 1000
+#define NTHREADS 4
+
+struct result {
+  long x;
+  long y;
+  long z;
+};
+
+void error(int err, char *msg) {
+  fprintf(stderr,"%s a retourné %d, message d'erreur : %s\n",msg,err,strerror(errno));
+  exit(EXIT_FAILURE);
+}
+
+
+long power(long i, long j) {
+  long r=i;
+  while(j>0) {
+    r=r*i;
+    j--;
+  }
+  return r;
+}
+
+
+void *fermat (void * param) {
+
+  struct result *r=(struct result *)malloc(sizeof(struct result));
+  if(r==NULL)
+    error(-1,"malloc");
+
+  long n=(long) param;
+  for(long x=1;x<MAXNUM;x++) {
+    for(long y=1;y<MAXNUM;y++) {
+      for(int z=1;z<MAXNUM;z++) {
+	if( (power(x,n)+power(y,n))==power(z,n) ) {
+	      r->x=x;
+	      r->y=y;
+	      r->z=z;
+	      return((void *) r);
+	}
+      }
+    }
+  }
+  return(NULL);
+}
+
+int main (int argc, char *argv[])  {
+  pthread_t threads[NTHREADS];
+  int err;
+
+  for(int i=0;i<NTHREADS;i++) {
+    err=pthread_create(&(threads[i]),NULL,&fermat,(void *)(long) i+2);
+    if(err!=0)
+      error(err,"pthread_create");
+  }
+
+
+
+  for(int i=0;i<NTHREADS;i++) {
+    void *p;
+    err=pthread_join(threads[i],(void **)&(p));
+
+    if(err!=0)
+      error(err,"pthread_create");
+    //if(p!=NULL) {
+    //struct result r;
+      //      r=(struct result) p;
+      //printf("Trouvé pour %d : x=%ld, y=%ld, z=%ld\n",i+2,r[i].x,r[i].y, r[i].z);
+  }
+
+
+  return(EXIT_SUCCESS);
+}
diff --git a/_static/src/Threads/S5-src/pthread-array.c b/_static/src/Threads/S5-src/pthread-array.c
new file mode 100644
index 0000000000000000000000000000000000000000..242a3209a44a8f4d319bd166af38d42542d38909
--- /dev/null
+++ b/_static/src/Threads/S5-src/pthread-array.c
@@ -0,0 +1,51 @@
+/**************************************
+ * pthread-neg.c
+ *
+ * Programme d'exemple de pthread utilisant les
+ * arguments et retournant une valeur
+ *
+ **************************************/
+
+#include <pthread.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+
+void error(int err, char *msg) {
+  fprintf(stderr,"%s a retourné %d, message d'erreur : %s\n",msg,err,strerror(errno));
+  exit(EXIT_FAILURE);
+}
+
+///AAA
+#define NTHREADS 4
+#define SIZE 100
+
+pthread_t mythread;
+
+void *f(void *param) {
+  int *v=(int *) param;
+  long r=0;
+  for(long i=0;i<SIZE;i++) {
+    r+=v[i];
+  }
+  return((void *) r);
+}
+
+void launch(void ){
+  int v[SIZE];
+  for(int i=0;i<SIZE;i++) {
+    v[i]=1;
+  }
+  int err=pthread_create(&(mythread),NULL,&f,(void *) v);
+  if(err!=0)
+    error(err,"pthread_create");
+}
+
+
+int main (int argc, char *argv[])  {
+
+  launch();
+  // ...
+  return(EXIT_SUCCESS);
+}
diff --git a/_static/src/Threads/S5-src/pthread-neg.c b/_static/src/Threads/S5-src/pthread-neg.c
new file mode 100644
index 0000000000000000000000000000000000000000..efc0b74ff6bddae9c8d8169aaed7cccfece1edd0
--- /dev/null
+++ b/_static/src/Threads/S5-src/pthread-neg.c
@@ -0,0 +1,51 @@
+/**************************************
+ * pthread-neg.c
+ *
+ * Programme d'exemple de pthread utilisant les
+ * arguments et retournant une valeur
+ *
+ **************************************/
+
+#include <pthread.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+
+void error(int err, char *msg) {
+  fprintf(stderr,"%s a retourné %d, message d'erreur : %s\n",msg,err,strerror(errno));
+  exit(EXIT_FAILURE);
+}
+
+///AAA
+#define NTHREADS 4
+void *neg (void * param) {
+  int *l;
+  l=(int *) param;
+  int *r=(int *)malloc(sizeof(int));
+  *r=-*l;
+  return ((void *) r);
+}
+
+int main (int argc, char *argv[])  {
+  pthread_t threads[NTHREADS];
+  int arg[NTHREADS];
+  int err;
+
+  for(long i=0;i<NTHREADS;i++) {
+    arg[i]=i;
+    err=pthread_create(&(threads[i]),NULL,&neg,(void *) &(arg[i]));
+    if(err!=0)
+      error(err,"pthread_create");
+  }
+
+  for(int i=0;i<NTHREADS;i++) {
+    int *r;
+    err=pthread_join(threads[i],(void **)&r);
+    printf("Resultat[%d]=%d\n",i,*r);
+    free(r);
+    if(err!=0)
+      error(err,"pthread_join");
+  }
+  return(EXIT_SUCCESS);
+}
diff --git a/_static/src/Threads/S5-src/pthread-neg2.c b/_static/src/Threads/S5-src/pthread-neg2.c
new file mode 100644
index 0000000000000000000000000000000000000000..15573be985fee78fd349496be1f4d64bab2dbe80
--- /dev/null
+++ b/_static/src/Threads/S5-src/pthread-neg2.c
@@ -0,0 +1,54 @@
+/**************************************
+ * pthread-neg.c
+ *
+ * Programme d'exemple de pthread utilisant les
+ * arguments et retournant une valeur
+ *
+ **************************************/
+
+#include <pthread.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+
+void error(int err, char *msg) {
+  fprintf(stderr,"%s a retourné %d, message d'erreur : %s\n",msg,err,strerror(errno));
+  exit(EXIT_FAILURE);
+}
+
+///AAA
+#define NTHREADS 4
+void *neg (void * param) {
+  int *l;
+  l=(int *) param;
+  int *r=(int *)malloc(sizeof(int));
+  *r=-*l;
+  return ((void *) r);
+}
+
+int main (int argc, char *argv[])  {
+  pthread_t threads[NTHREADS];
+  int arg[NTHREADS];
+  int err;
+
+  for(int i=0;i<NTHREADS;i++) {
+    arg[i]=i;
+  }
+  for(int i=0;i<NTHREADS;i++) {
+    err=pthread_create(&(threads[i]),NULL,&neg,(void *) &(arg[i]));
+    if(err!=0)
+      error(err,"pthread_create");
+  }
+
+  for(int i=0;i<NTHREADS;i++) {
+    int *r;
+    err=pthread_join(threads[i],(void **)&r);
+
+    printf("Resultat[%d]=%d\n",i,*r);
+    free(r);
+    if(err!=0)
+      error(err,"pthread_join");
+  }
+  return(EXIT_SUCCESS);
+}
diff --git a/_static/src/Threads/S5-src/pthread-test-if.c b/_static/src/Threads/S5-src/pthread-test-if.c
new file mode 100644
index 0000000000000000000000000000000000000000..d901ebe3b4cad95a5bbc61b2ba923305a4f0b148
--- /dev/null
+++ b/_static/src/Threads/S5-src/pthread-test-if.c
@@ -0,0 +1,77 @@
+/**************************************
+ * pthread-test.c
+ *
+ * Programme d'exemple de pthread avec condition de course
+ *
+ **************************************/
+
+#include <pthread.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+
+void error(int err, char *msg) {
+  fprintf(stderr,"%s a retourné %d, message d'erreur : %s\n",msg,err,strerror(errno));
+  exit(EXIT_FAILURE);
+}
+
+
+///AAA
+
+long global=0;
+int even=0;
+int odd=0;
+
+void test_even(int i) {
+  if((i%2)==0)
+    even++;
+}
+
+int increment(int i) {
+  return i+1;
+}
+
+void *inc(void * param) {
+  for(int j=0;j<1000000;j++) {
+    global=increment(global);
+  }
+  pthread_exit(NULL);
+}
+
+void *even(void * param) {
+  for(int j=0;j<1000000;j++) {
+    test_even(global);
+  }
+  pthread_exit(NULL);
+}
+
+int main (int argc, char *argv[])  {
+  pthread_t thread_inc;
+  pthread_t thread_even;
+  int err;
+
+  err=pthread_create(&(thread_inc),NULL,&inc,NULL);
+  if(err!=0) {
+    error(err,"pthread_create");
+  }
+
+  err=pthread_create(&(thread_even),NULL,&inc,NULL);
+  if(err!=0) {
+    error(err,"pthread_create");
+  }
+
+  err=pthread_join(thread_inc,NULL);
+  if(err!=0)
+    error(err,"pthread_join");
+  }
+
+  err=pthread_join(thread_even,NULL);
+  if(err!=0)
+    error(err,"pthread_join");
+  }
+
+  printf("global: %ld, even:%ld\n",global);
+
+  return(EXIT_SUCCESS);
+}
diff --git a/_static/src/Threads/S5-src/pthread-test.c b/_static/src/Threads/S5-src/pthread-test.c
new file mode 100644
index 0000000000000000000000000000000000000000..0cfb277d9aa349afd6f0f8bf5dc9ec74bdab10d8
--- /dev/null
+++ b/_static/src/Threads/S5-src/pthread-test.c
@@ -0,0 +1,56 @@
+/**************************************
+ * pthread-test.c
+ *
+ * Programme d'exemple de pthread avec condition de course
+ *
+ **************************************/
+
+#include <pthread.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+
+///AAA
+
+#define NTHREADS 4
+
+long global=0;
+
+void error(int err, char *msg) {
+  fprintf(stderr,"%s a retourné %d, message d'erreur : %s\n",msg,err,strerror(errno));
+  exit(EXIT_FAILURE);
+}
+
+int increment(int i) {
+  return i+1;
+}
+
+void *func(void * param) {
+  for(int j=0;j<1000000;j++) {
+    global=increment(global);
+  }
+  pthread_exit(NULL);
+}
+
+int main (int argc, char *argv[])  {
+  pthread_t thread[NTHREADS];
+  int err;
+
+  for(int i=0;i<NTHREADS;i++) {
+    err=pthread_create(&(thread[i]),NULL,&func,NULL);
+    if(err!=0)
+      error(err,"pthread_create");
+  }
+  for(int i=0; i<1000000000;i++) { /*...*/ }
+
+  for(int i=NTHREADS-1;i>=0;i--) {
+    err=pthread_join(thread[i],NULL);
+    if(err!=0)
+      error(err,"pthread_join");
+  }
+
+  printf("global: %ld\n",global);
+
+  return(EXIT_SUCCESS);
+}
diff --git a/_static/src/Threads/S5-src/pthread.c b/_static/src/Threads/S5-src/pthread.c
new file mode 100644
index 0000000000000000000000000000000000000000..4e2741c68832e16f565b1305d5ce5e05f617564b
--- /dev/null
+++ b/_static/src/Threads/S5-src/pthread.c
@@ -0,0 +1,57 @@
+/**************************************
+ * pthread.c
+ *
+ * Programme d'exemple de pthread
+ *
+ **************************************/
+///AAA
+#include <pthread.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+
+int global=0;
+
+void error(int err, char *msg) {
+  fprintf(stderr,"%s a retourné %d, message d'erreur : %s\n",msg,err,strerror(errno));
+  exit(EXIT_FAILURE);
+}
+
+void *thread_first(void * param) {
+  global++;
+  return(NULL);
+}
+
+void *thread_second(void * param) {
+  global++;
+  pthread_exit(NULL);
+}
+
+int main (int argc, char *argv[])  {
+  pthread_t first;
+  pthread_t second;
+  int err;
+
+  err=pthread_create(&first,NULL,&thread_first,NULL);
+  if(err!=0)
+    error(err,"pthread_create");
+
+  err=pthread_create(&second,NULL,&thread_second,NULL);
+  if(err!=0)
+    error(err,"pthread_create");
+
+  for(int i=0; i<1000000000;i++) { /*...*/ }
+
+  err=pthread_join(second,NULL);
+    if(err!=0)
+      error(err,"pthread_join");
+
+  err=pthread_join(first,NULL);
+    if(err!=0)
+      error(err,"pthread_join");
+
+  printf("global: %d\n",global);
+
+  return(EXIT_SUCCESS);
+}
diff --git a/_static/src/Threads/S5-src/ptr-char.c b/_static/src/Threads/S5-src/ptr-char.c
new file mode 100644
index 0000000000000000000000000000000000000000..4af3385ff319c996f6ed3879c11b1f8f65e8288c
--- /dev/null
+++ b/_static/src/Threads/S5-src/ptr-char.c
@@ -0,0 +1,21 @@
+/**************************************
+ * ptr.c
+ *
+ * Programme d'exemple pour les pointeurs
+ *
+ **************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+
+int main(int argc, char **argv) {
+
+  for(char **ptr=argv;*ptr!=NULL;ptr++) {
+    printf("Pointeur : %p, chaîne:%s\n",ptr,*ptr);
+  }
+
+}
+
+
+
+
diff --git a/_static/src/Threads/S5-src/ptr.c b/_static/src/Threads/S5-src/ptr.c
new file mode 100644
index 0000000000000000000000000000000000000000..c4ddc482ae1c7be7d615c7456f622e44dbf05559
--- /dev/null
+++ b/_static/src/Threads/S5-src/ptr.c
@@ -0,0 +1,38 @@
+/**************************************
+ * ptr.c
+ *
+ * Programme d'exemple pour les pointeurs
+ *
+ **************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+
+int main(int argc, char *argv[]) {
+
+  int a=1252;
+  int b=1;
+  int *p=&a;
+  int **pp=&(p);
+
+  printf("a=%d [%p], b=%d [%p], p=%p, *p=%d, pp=%p, *pp=%p, **pp=%d\n",a,&a,b,&b,p,*p,pp,*pp,**pp);
+
+  a++;
+
+  printf("a=%d [%p], b=%d [%p], p=%p, *p=%d, pp=%p, *pp=%p, **pp=%d\n",a,&a,b,&b,p,*p,pp,*pp,**pp);
+
+
+  *p=*p+1;
+  printf("a=%d [%p], b=%d [%p], p=%p, *p=%d, pp=%p, *pp=%p, **pp=%d\n",a,&a,b,&b,p,*p,pp,*pp,**pp);
+
+  *pp=&b;
+
+  printf("a=%d [%p], b=%d [%p], p=%p, *p=%d, pp=%p, *pp=%p, **pp=%d\n",a,&a,b,&b,p,*p,pp,*pp,**pp);
+
+
+
+}
+
+
+
+
diff --git a/_static/src/Threads/S5-src/ptrptr.c b/_static/src/Threads/S5-src/ptrptr.c
new file mode 100644
index 0000000000000000000000000000000000000000..1044c2a914f7f8902b5257fd951ec34e529fbdd3
--- /dev/null
+++ b/_static/src/Threads/S5-src/ptrptr.c
@@ -0,0 +1,24 @@
+/**************************************
+ * ptrptr.c
+ *
+ * Programme d'exemple pour les pointeurs
+ * vers des pointeurs
+ *
+ **************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+///AAA
+int main(int argc, char **argv) {
+
+  char **p;
+  p=argv;
+  printf("Arguments :");
+  while(*p!=NULL) {
+    printf(" %s",*p);
+    p++;
+  }
+  printf("\n");
+  return(EXIT_SUCCESS);
+}
+///BBB
diff --git a/_static/src/Threads/S5-src/qsort.c b/_static/src/Threads/S5-src/qsort.c
new file mode 100644
index 0000000000000000000000000000000000000000..3e834bba35d90ebcebafc19a92e954a0e72d5723
--- /dev/null
+++ b/_static/src/Threads/S5-src/qsort.c
@@ -0,0 +1,41 @@
+/**************************************
+ * qosrt.c
+ *
+ * Programme d'exemple d'utilisation de qsort
+ *
+ **************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+///AAA
+#define SIZE 5
+double array[SIZE]= { 1.0, 7.32, -3.43, 8.7, 9.99 };
+
+void print_array() {
+  for(int i=0;i<SIZE;i++)
+    printf("array[i]:%f\n",array[i]);
+}
+
+int cmp(const void *ptr1, const void *ptr2) {
+  const double *a=ptr1;
+  const double *b=ptr2;
+  if(*a==*b)
+    return 0;
+  else
+    if(*a<*b)
+      return -1;
+    else
+      return +1;
+}
+
+int main(int argc, char *argv[]) {
+
+  printf("Avant qsort\n\n");
+  print_array();
+  qsort(array,SIZE,sizeof(double),cmp);
+  printf("Après qsort\n\n");
+  print_array();
+
+  return(EXIT_SUCCESS);
+}
+///BBB
diff --git a/_static/src/Threads/S5-src/strip.c b/_static/src/Threads/S5-src/strip.c
new file mode 100644
index 0000000000000000000000000000000000000000..238480980fb8277719d9ea2576bb3633d01aff8e
--- /dev/null
+++ b/_static/src/Threads/S5-src/strip.c
@@ -0,0 +1,53 @@
+/**************************************
+ * strip.c
+ *
+ * Programme d'exemple de fonction avec char **
+ *
+ **************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+int strip(char **str) {
+  int count=0;
+  char *c;
+  c=*str;
+  int len=strlen(c);
+  for(int i=0; i<len;i++) {
+    if(*c==' ') {
+      count++;
+    }
+    c++;
+  }
+  int removed=0;
+  c=*str;
+  char *string=(char *) malloc(sizeof(char)*count+1);
+  char *r=string;
+  for(int i=0; i<strlen(*str);i++) {
+    if(*c!=' ') {
+      *r=*c;
+      r++;
+      removed++;
+    }
+    c++;
+  }
+  *r='\0';
+  *str=string;
+  return removed;
+}
+
+int main(int  argc, char *argv[]) {
+  char *s1=" lkslskldklqkds";
+  char *s2="alkjlksj skdjlskd sqdlkj";
+  char **s1ptr=&(s1);
+  char **s2ptr=&(s2);
+  int n1=strip(s1ptr);
+  printf("n1=%d, %s\n",n1,s1);
+  int n2=strip(s2ptr);
+  printf("n2=%d, %s\n",n2,s2);
+
+
+}
+
+
diff --git a/_static/src/Threads/S5-src/strsep.c b/_static/src/Threads/S5-src/strsep.c
new file mode 100644
index 0000000000000000000000000000000000000000..a523cd67169889939873f47a484dc0f4f8f64f76
--- /dev/null
+++ b/_static/src/Threads/S5-src/strsep.c
@@ -0,0 +1,46 @@
+/**************************************
+ * stresep.c
+ *
+ * Implementation partielle de strtol
+ *
+ **************************************/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <ctype.h>
+
+int mystrtol(const char *restrict str,
+	     char **restrict endptr,
+	     int base) {
+
+  int val;
+  int i=0;
+  int err=0;
+  while(!err && *(str+i)!='\0')
+    {
+      if(!isdigit(*(str+i))) {
+	err=1;
+	*endptr=(char *)(str+i);
+      }
+      i++;
+    }
+  // ...
+
+  return val;
+}
+
+
+int main(int argc, char *argv[])
+{
+  char *p, *s;
+  long li;
+  s = "1252m";
+  li = mystrtol(s,&p,10);
+  if(p!=NULL) {
+    printf("Caractère erronné : %c\n",*p);
+      // p pointe vers le caractère en erreur
+  }
+  printf("Valeur convertie : %s -> %ld\n",s,li);
+  return(EXIT_SUCCESS);
+
+}
diff --git a/_static/src/Threads/S5-src/strtol.c b/_static/src/Threads/S5-src/strtol.c
new file mode 100644
index 0000000000000000000000000000000000000000..b1755d6fa8bdd9d8dea44720458583bbe5539441
--- /dev/null
+++ b/_static/src/Threads/S5-src/strtol.c
@@ -0,0 +1,34 @@
+/**************************************
+ * strtol.c
+ *
+ * Programme d'exemple d'utilisation de strtol
+ *
+ **************************************/
+///AAA
+#include <stdlib.h>
+#include <stdio.h>
+
+int main(int argc, char *argv[]) {
+
+  char *p, *s;
+  long li;
+  s = "1252";
+  li = strtol(s,&p,10);
+  if(*p != '\0') {
+    printf("Caractère erronné : %c\n",*p);
+      // p pointe vers le caractère en erreur
+  }
+  printf("Valeur convertie : %s -> %ld\n",s,li);
+
+  s = "12m52";
+  li = strtol(s,&p,10);
+  if(*p != '\0') {
+    printf("Caractère erronné : %c\n",*p);
+  }
+  printf("Valeur convertie : %s -> %ld\n",s,li);
+
+  return(EXIT_SUCCESS);
+}
+
+
+
diff --git a/_static/src/Threads/S5-src/sudoku.c b/_static/src/Threads/S5-src/sudoku.c
new file mode 100644
index 0000000000000000000000000000000000000000..215e3e4e4857e09d450ceedcf2efc6765b16e5d6
--- /dev/null
+++ b/_static/src/Threads/S5-src/sudoku.c
@@ -0,0 +1,99 @@
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <unistd.h>
+
+#define SUDOKU_MAX (9)
+#define SUDOKU_DIM (SUDOKU_MAX)
+#define SUDOKU_BOX (3)
+
+typedef struct {
+	int grid[SUDOKU_DIM][SUDOKU_DIM];
+} sudoku_t;
+
+static sudoku_t sudokus[] = {
+	{ /* First sudoku */
+		.grid = {
+			{8, 1, 5, 3, 4, 2, 9, 6, 7},
+			{6, 0, 9, 7, 8, 1, 4, 2, 0},
+			{7, 4, 2, 5, 6, 9, 0, 8, 1},
+			{3, 8, 4, 9, 0, 6, 5, 1, 2},
+			{9, 7, 1, 2, 5, 4, 6, 3, 8},
+			{5, 2, 6, 0, 3, 8, 7, 4, 9},
+			{4, 0, 3, 8, 2, 7, 0, 9, 6},
+			{2, 9, 7, 6, 1, 3, 8, 5, 4},
+			{1, 6, 8, 4, 0, 5, 2, 7, 3},
+		}
+	},
+	/* TODO fill with new sudokus */
+};
+
+
+static void print_sudoku(sudoku_t *s)
+{
+	int i, j;
+
+	for (i = 0; i < SUDOKU_DIM; ++i) {
+		if (!(i % SUDOKU_BOX))
+			printf("+-------+-------+-------+\n");
+		for (j = 0; j < SUDOKU_DIM; ++j) {
+			if (!(j % SUDOKU_BOX))
+				printf("| ");
+			printf("%d ", s->grid[i][j]);
+		}
+		printf("|\n");
+	}
+	printf("+-------+-------+-------+\n");
+	fflush(stdout);
+}
+
+static int validate_sudoku(sudoku_t *s)
+{
+	int i, j, k, l;
+
+	/* check sum of rows and columns + check that they only
+	 * contain once one number from [1, 9] */
+	for (i = 0; i < SUDOKU_DIM; ++i) {
+		int used_row[SUDOKU_MAX];
+		int used_col[SUDOKU_MAX];
+		memset(used_row, 0, sizeof(used_row));
+		memset(used_col, 0, sizeof(used_col));
+		int sum_row = 0, sum_col = 0;
+		for (j = 0; j < SUDOKU_DIM; ++j) {
+			if (used_row[s->grid[i][j]-1] > 0)
+				return 0;
+			if (used_col[s->grid[j][i]-1] > 0)
+				return 0;
+			sum_row += s->grid[i][j];
+			sum_col += s->grid[j][i];
+			used_row[s->grid[i][j]-1]++;
+			used_col[s->grid[j][i]-1]++;
+		}
+		if (sum_row != 45 || sum_col != 45)
+			return 0;
+	}
+
+	/* check sum of boxes */
+	for (k = 0; k < SUDOKU_DIM / SUDOKU_BOX; ++k) {
+		for (l = 0; l < SUDOKU_DIM / SUDOKU_BOX; ++l) {
+			int sum = 0;
+			for (i = 0; i < SUDOKU_BOX; ++i)
+				for (j = 0; j < SUDOKU_BOX; ++j)
+				 	sum += s->grid[SUDOKU_BOX * k + i][SUDOKU_BOX * l + j];
+			if (sum != 45)
+				return 0;
+		}
+	}
+
+
+	return 1;
+}
+
+
+int main(int argc, char *argv[])
+{
+	/* A COMPLETER */
+	print_sudoku(&sudokus[0]);
+
+	return 0;
+}
diff --git a/_static/src/Threads/S6-src/Makefile b/_static/src/Threads/S6-src/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..2aa4fb2bec558ba3a7ce233ec09acd46ad48165f
--- /dev/null
+++ b/_static/src/Threads/S6-src/Makefile
@@ -0,0 +1,36 @@
+#
+# Makefile for source code
+#
+# Builds all .c files, assuming they are all independant and runs them
+# to collect the output on stdout
+#
+# Automatically builds some of the examples to be included in the text
+#
+
+GCC	= gcc
+
+CFLAGS = -Wall -std=c99
+LDFLAGS = -lpthread
+
+ASMFLAGS = -Wall -std=c99 -O0 -fverbose-asm -fno-stack-protector -m32 -S
+
+CFILES := $(patsubst %.c,%.exe,$(wildcard *.c))
+ASMFILES := $(patsubst %.c,%.s,$(wildcard *.c))
+OUTPUT := $(patsubst %.c,%.out,$(wildcard *.c))
+
+
+all: ${CFILES} ${OUTPUT}
+
+%.s: %.c
+	@echo compiling $<
+	$(GCC) $(ASMFLAGS)  $<
+
+%.exe: %.c
+	@echo compiling $<
+	$(GCC) $(CFLAGS) -o $@ $< $(LDFLAGS)
+
+%.out: %.exe
+	rm -f $@
+	@echo executing $<
+	./$< >$@
+
diff --git a/_static/src/Threads/S6-src/arraylist.c b/_static/src/Threads/S6-src/arraylist.c
new file mode 100644
index 0000000000000000000000000000000000000000..406b7a1d8322bf033f0bb8d33d1ef48b6b65ac13
--- /dev/null
+++ b/_static/src/Threads/S6-src/arraylist.c
@@ -0,0 +1,53 @@
+#include <pthread.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#define N_THREADS 4
+#define LIST_SIZE 1000
+#define N_RAND    100000
+
+static struct {
+	pthread_mutex_t mutex;
+	int val;
+} list[LIST_SIZE];
+
+static void *thread_random(void *arg)
+{
+	int i, r;
+
+	for (i = 0; i < N_RAND; ++i) {
+		r = rand() % LIST_SIZE;
+
+		pthread_mutex_lock(&list[r].mutex);
+		list[r].val++;
+		pthread_mutex_unlock(&list[r].mutex);
+	}
+
+	return NULL;
+}
+
+
+int main (int argc, char const *argv[])
+{
+	int i, sum;
+	pthread_t threads[N_THREADS];
+
+	// init elements mutexes
+	for (i = 0; i < LIST_SIZE; ++i)
+		pthread_mutex_init(&list[i].mutex, NULL);
+
+	for (i = 0; i < N_THREADS; ++i)
+		pthread_create(&threads[i], NULL, thread_random, NULL);
+
+	for (i = 0; i < N_THREADS; ++i)
+		pthread_join(threads[i], NULL);
+
+	sum = 0;
+	for (i = 0; i < LIST_SIZE; ++i) {
+		sum += list[i].val;
+		pthread_mutex_destroy(&list[i].mutex);
+	}
+	printf("Sum of all elements: %d =?= %d\n", sum, N_THREADS * N_RAND);
+
+	return 0;
+}
diff --git a/_static/src/Threads/S6-src/arraylist2.c b/_static/src/Threads/S6-src/arraylist2.c
new file mode 100644
index 0000000000000000000000000000000000000000..07ad5d48bf820f56ba3a926e92153dd15d2b2b5d
--- /dev/null
+++ b/_static/src/Threads/S6-src/arraylist2.c
@@ -0,0 +1,50 @@
+#include <pthread.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#define N_THREADS 4
+#define LIST_SIZE 1000
+#define N_RAND    100000
+
+pthread_mutex_t mutex;
+static int list[LIST_SIZE];
+
+static void *thread_random(void *arg)
+{
+	int i, r;
+
+	for (i = 0; i < N_RAND; ++i) {
+		r = rand() % LIST_SIZE;
+
+		pthread_mutex_lock(&mutex);
+		list[r]++;
+		pthread_mutex_unlock(&mutex);
+	}
+
+	return NULL;
+}
+
+
+int main (int argc, char const *argv[])
+{
+	int i, sum;
+	pthread_t threads[N_THREADS];
+
+	// init elements mutex
+	pthread_mutex_init(&mutex, NULL);
+
+	for (i = 0; i < N_THREADS; ++i)
+		pthread_create(&threads[i], NULL, thread_random, NULL);
+
+	for (i = 0; i < N_THREADS; ++i)
+		pthread_join(threads[i], NULL);
+
+	sum = 0;
+	pthread_mutex_destroy(&mutex);
+	for (i = 0; i < LIST_SIZE; ++i)
+		sum += list[i];
+
+	printf("Sum of all elements: %d =?= %d\n", sum, N_THREADS * N_RAND);
+
+	return 0;
+}
diff --git a/_static/src/Threads/S6-src/pthread-mutex-perf.c b/_static/src/Threads/S6-src/pthread-mutex-perf.c
new file mode 100644
index 0000000000000000000000000000000000000000..63eab9f09c8cc776794aa0309a4f483c1ca57720
--- /dev/null
+++ b/_static/src/Threads/S6-src/pthread-mutex-perf.c
@@ -0,0 +1,116 @@
+/**************************************
+ * pthread-mutex.c
+ *
+ * Programme d'exemple de pthread avec
+ * utilisation de mutex pour éviter une
+ * violation de section critique
+ *
+ **************************************/
+
+#include <pthread.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <sys/time.h>
+
+/* Return t2-t1 in microseconds */
+long timeval_diff(struct timeval *t2, struct timeval *t1)
+{
+  long diff = (t2->tv_usec + 1000000 * t2->tv_sec) - (t1->tv_usec + 1000000 * t1->tv_sec);
+  return (diff);
+}
+
+void error(int err, char *msg) {
+  fprintf(stderr,"%s a retourné %d, message d'erreur : %s\n",msg,err,strerror(errno));
+  exit(EXIT_FAILURE);
+}
+
+///AAA
+#include <pthread.h>
+#define LOOP 40000
+#define LOOP_CRITIQUE 40000
+#define N 4
+
+int percent; // pourcentage de temps en section critique
+int nthreads; // nombre de threads
+pthread_mutex_t mutex;
+
+void critique() {
+  long j=0;
+  for(int i=0;i<(LOOP_CRITIQUE*percent)/100;i++) {
+    j+=i;
+    // ...
+  }
+}
+
+void noncritique() {
+  int j=0;
+  for(int i=0;i<(LOOP_CRITIQUE*(100-percent))/100;i++) {
+    j-=i;
+    // ...
+  }
+}
+
+
+void *func(void * param) {
+  for(int j=0;j<LOOP/nthreads;j++) {
+    pthread_mutex_lock(&mutex);
+    critique();
+    pthread_mutex_unlock(&mutex);
+    noncritique();
+  }
+  return(NULL);
+}
+
+int main (int argc, char *argv[])  {
+  int err;
+  struct timeval tvStart, tvEnd;
+  long mesures[N];
+
+  if(argc!=3)
+    return(EXIT_FAILURE);
+
+  char *endptr;
+  percent=strtol(argv[1],&endptr,10);
+  nthreads=strtol(argv[2],&endptr,10);
+
+  pthread_t thread[nthreads];
+
+  err=pthread_mutex_init( &mutex, NULL);
+  if(err!=0)
+      error(err,"pthread_mutex_init");
+
+  for (int j=0;j<N;j++)  {
+
+    err=gettimeofday(&tvStart, NULL);
+    if(err!=0)
+      exit(EXIT_FAILURE);
+
+    for(int i=0;i<nthreads;i++) {
+      err=pthread_create(&(thread[i]),NULL,&func,NULL);
+      if(err!=0)
+	error(err,"pthread_create");
+    }
+
+    for(int i=nthreads-1;i>=0;i--) {
+      err=pthread_join(thread[i],NULL);
+      if(err!=0)
+	error(err,"pthread_join");
+    }
+    err=gettimeofday(&tvEnd, NULL);
+    if(err!=0)
+      exit(EXIT_FAILURE);
+
+    mesures[i]=timeval_diff(&tvEnd, &tvStart);
+    sum+=mesures[i];
+
+  }
+  printf("%d, %d, %ld\n",nthreads,percent,sum/N);
+
+  err=pthread_mutex_destroy(&mutex);
+  if(err!=0)
+    error(err,"pthread_destroy");
+
+  return(EXIT_SUCCESS);
+}
diff --git a/_static/src/Threads/S6-src/pthread-mutex.c b/_static/src/Threads/S6-src/pthread-mutex.c
new file mode 100644
index 0000000000000000000000000000000000000000..891d1cf91baf1c29fe8e001b2419febe1a3bc673
--- /dev/null
+++ b/_static/src/Threads/S6-src/pthread-mutex.c
@@ -0,0 +1,75 @@
+/**************************************
+ * pthread-mutex.c
+ *
+ * Programme d'exemple de pthread avec
+ * utilisation de mutex pour éviter une
+ * violation de section critique
+ *
+ **************************************/
+
+#include <pthread.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+
+
+void error(int err, char *msg) {
+  fprintf(stderr,"%s a retourné %d, message d'erreur : %s\n",msg,err,strerror(errno));
+  exit(EXIT_FAILURE);
+}
+
+///AAA
+#include <pthread.h>
+#define NTHREADS 4
+
+long global=0;
+pthread_mutex_t mutex_global;
+
+int increment(int i) {
+  return i+1;
+}
+
+void *func(void * param) {
+  int err;
+  for(int j=0;j<1000000;j++) {
+    err=pthread_mutex_lock(&mutex_global);
+    if(err!=0)
+      error(err,"pthread_mutex_lock");
+    global=increment(global);
+    err=pthread_mutex_unlock(&mutex_global);
+    if(err!=0)
+      error(err,"pthread_mutex_unlock");
+  }
+  return(NULL);
+}
+
+int main (int argc, char *argv[])  {
+  pthread_t thread[NTHREADS];
+  int err;
+
+  err=pthread_mutex_init( &mutex_global, NULL);
+  if(err!=0)
+      error(err,"pthread_mutex_init");
+
+  for(int i=0;i<NTHREADS;i++) {
+    err=pthread_create(&(thread[i]),NULL,&func,NULL);
+    if(err!=0)
+      error(err,"pthread_create");
+  }
+  for(int i=0; i<1000000000;i++) { /*...*/ }
+
+  for(int i=NTHREADS-1;i>=0;i--) {
+    err=pthread_join(thread[i],NULL);
+    if(err!=0)
+      error(err,"pthread_join");
+  }
+
+  err=pthread_mutex_destroy(&mutex_global);
+  if(err!=0)
+    error(err,"pthread_mutex_destroy");
+
+  printf("global: %ld\n",global);
+
+  return(EXIT_SUCCESS);
+}
diff --git a/_static/src/Threads/S6-src/pthread-mutex.out b/_static/src/Threads/S6-src/pthread-mutex.out
new file mode 100644
index 0000000000000000000000000000000000000000..f9d92b29b14dfabfaf0ba54735e13a1abc82cd82
--- /dev/null
+++ b/_static/src/Threads/S6-src/pthread-mutex.out
@@ -0,0 +1 @@
+global: 4000000
diff --git a/_static/src/Threads/S6-src/pthread-neg2.c b/_static/src/Threads/S6-src/pthread-neg2.c
new file mode 100644
index 0000000000000000000000000000000000000000..efc0b74ff6bddae9c8d8169aaed7cccfece1edd0
--- /dev/null
+++ b/_static/src/Threads/S6-src/pthread-neg2.c
@@ -0,0 +1,51 @@
+/**************************************
+ * pthread-neg.c
+ *
+ * Programme d'exemple de pthread utilisant les
+ * arguments et retournant une valeur
+ *
+ **************************************/
+
+#include <pthread.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+
+void error(int err, char *msg) {
+  fprintf(stderr,"%s a retourné %d, message d'erreur : %s\n",msg,err,strerror(errno));
+  exit(EXIT_FAILURE);
+}
+
+///AAA
+#define NTHREADS 4
+void *neg (void * param) {
+  int *l;
+  l=(int *) param;
+  int *r=(int *)malloc(sizeof(int));
+  *r=-*l;
+  return ((void *) r);
+}
+
+int main (int argc, char *argv[])  {
+  pthread_t threads[NTHREADS];
+  int arg[NTHREADS];
+  int err;
+
+  for(long i=0;i<NTHREADS;i++) {
+    arg[i]=i;
+    err=pthread_create(&(threads[i]),NULL,&neg,(void *) &(arg[i]));
+    if(err!=0)
+      error(err,"pthread_create");
+  }
+
+  for(int i=0;i<NTHREADS;i++) {
+    int *r;
+    err=pthread_join(threads[i],(void **)&r);
+    printf("Resultat[%d]=%d\n",i,*r);
+    free(r);
+    if(err!=0)
+      error(err,"pthread_join");
+  }
+  return(EXIT_SUCCESS);
+}
diff --git a/_static/src/Threads/S6-src/pthread-neg2.out b/_static/src/Threads/S6-src/pthread-neg2.out
new file mode 100644
index 0000000000000000000000000000000000000000..d5823dd8ef29e10d55c1c0b0085387ce326e5d98
--- /dev/null
+++ b/_static/src/Threads/S6-src/pthread-neg2.out
@@ -0,0 +1,4 @@
+Resultat[0]=0
+Resultat[1]=-1
+Resultat[2]=-2
+Resultat[3]=-3
diff --git a/_static/src/Threads/S6-src/pthread-philo.c b/_static/src/Threads/S6-src/pthread-philo.c
new file mode 100644
index 0000000000000000000000000000000000000000..33d63c137ecf32e6359464660adb269648fdfb91
--- /dev/null
+++ b/_static/src/Threads/S6-src/pthread-philo.c
@@ -0,0 +1,68 @@
+/**************************************
+ * pthread-philo.c
+ *
+ * Programme d'exemple de pthread avec
+ * philosophes qui dinent et mutex
+ *
+ **************************************/
+
+///AAA
+#include <pthread.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdbool.h>
+#include <unistd.h>
+
+#define PHILOSOPHES 3
+
+pthread_t phil[PHILOSOPHES];
+pthread_mutex_t baguette[PHILOSOPHES];
+
+void mange(int id) {
+  printf("Philosophe [%d] mange\n",id);
+  for(int i=0;i< rand(); i++) {
+    // philosophe mange
+  }
+}
+
+void* philosophe ( void* arg )
+{
+  int *id=(int *) arg;
+  int left = *id;
+  int right = (left + 1) % PHILOSOPHES;
+  while(true) {
+    printf("Philosophe [%d] pense\n",*id);
+    pthread_mutex_lock(&baguette[left]);
+    printf("Philosophe [%d] possède baguette gauche [%d]\n",*id,left);
+    pthread_mutex_lock(&baguette[right]);
+    printf("Philosophe [%d] possède baguette droite [%d]\n",*id,right);
+    mange(*id);
+    pthread_mutex_unlock(&baguette[left]);
+    printf("Philosophe [%d] a libéré baguette gauche [%d]\n",*id,left);
+    pthread_mutex_unlock(&baguette[right]);
+    printf("Philosophe [%d] a libéré baguette droite [%d]\n",*id,right);
+  }
+  return (NULL);
+}
+///BBB
+int main ( int argc, char *argv[])
+{
+   long i;
+   int id[PHILOSOPHES];
+
+   srand(getpid());
+
+   for (i = 0; i < PHILOSOPHES; i++)
+     id[i]=i;
+
+   for (i = 0; i < PHILOSOPHES; i++)
+      pthread_mutex_init( &baguette[i], NULL);
+
+   for (i = 0; i < PHILOSOPHES; i++)
+     pthread_create(&phil[i], NULL, philosophe, (void*)&(id[i]) );
+
+   for (i = 0; i < PHILOSOPHES; i++)
+      pthread_join(phil[i], NULL);
+
+   return (EXIT_SUCCESS);
+}
diff --git a/_static/src/Threads/S6-src/pthread-philo2.c b/_static/src/Threads/S6-src/pthread-philo2.c
new file mode 100644
index 0000000000000000000000000000000000000000..1e4113b83c358a1e84571aa1ce5f792a9bc1d504
--- /dev/null
+++ b/_static/src/Threads/S6-src/pthread-philo2.c
@@ -0,0 +1,95 @@
+/**************************************
+ * pthread-philo2.c
+ *
+ * Programme d'exemple de pthread avec
+ * philosophes qui dinent et mutex
+ *
+ **************************************/
+
+#include <pthread.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdbool.h>
+#include <unistd.h>
+#include <errno.h>
+#include <string.h>
+
+#define PHILOSOPHES 3
+
+static pthread_mutex_t baguette[PHILOSOPHES];
+
+
+void error(int err, char *msg) {
+  fprintf(stderr,"%s a retourné %d message d'erreur : %s\n",msg,err,strerror(errno));
+  exit(EXIT_FAILURE);
+}
+
+void mange(int id) {
+  printf("Philosophe [%d] mange\n",id);
+  for(int i=0;i< rand(); i++) {
+    // philosophe mange
+  }
+}
+
+///AAA
+
+void* philosophe ( void* arg )
+{
+  int *id=(int *) arg;
+  int left = *id;
+  int right = (left + 1) % PHILOSOPHES;
+  while(true) {
+    // philosophe pense
+    if(left<right) {
+      pthread_mutex_lock(&baguette[left]);
+      pthread_mutex_lock(&baguette[right]);
+    }
+    else {
+      pthread_mutex_lock(&baguette[right]);
+      pthread_mutex_lock(&baguette[left]);
+    }
+    mange(*id);
+    pthread_mutex_unlock(&baguette[left]);
+    pthread_mutex_unlock(&baguette[right]);
+  }
+  return (NULL);
+}
+///BBB
+int main ( int argc, char *argv[])
+{
+   int i;
+   int id[PHILOSOPHES];
+   int err;
+   pthread_t phil[PHILOSOPHES];
+
+   srand(getpid());
+
+   for (i = 0; i < PHILOSOPHES; i++)
+     id[i]=i;
+
+   for (i = 0; i < PHILOSOPHES; i++) {
+     err=pthread_mutex_init( &baguette[i], NULL);
+      if(err!=0)
+	error(err,"pthread_mutex_init");
+   }
+
+   for (i = 0; i < PHILOSOPHES; i++) {
+     err=pthread_create(&phil[i], NULL, philosophe, (void*)&(id[i]) );
+     if(err!=0)
+       error(err,"pthread_create");
+   }
+
+   for (i = 0; i < PHILOSOPHES; i++) {
+      pthread_join(phil[i], NULL);
+      if(err!=0)
+	error(err,"pthread_join");
+   }
+
+   for (i = 0; i < PHILOSOPHES; i++) {
+      pthread_mutex_destroy(&baguette[i]);
+      if(err!=0)
+	error(err,"pthread_mutex_destroy");
+   }
+
+   return (EXIT_SUCCESS);
+}
diff --git a/_static/src/Threads/S6-src/pthread-spin.c b/_static/src/Threads/S6-src/pthread-spin.c
new file mode 100644
index 0000000000000000000000000000000000000000..b4839da01400e690dfea38acab2bc7f8447fd916
--- /dev/null
+++ b/_static/src/Threads/S6-src/pthread-spin.c
@@ -0,0 +1,66 @@
+/**************************************
+ * pthread-spin.c
+ *
+ * Programme d'exemple de pthread avec
+ * utilisation de spinlock pour éviter une
+ * violation de section critique
+ *
+ **************************************/
+
+#include <pthread.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+
+
+void error(int err, char *msg) {
+  fprintf(stderr,"%s a retourné %d, message d'erreur : %s\n",msg,err,strerror(errno));
+  exit(EXIT_FAILURE);
+}
+
+///AAA
+
+#define NTHREADS 4
+
+long global=0;
+
+static pthread_spinlock_t spinlock_global;
+
+
+int increment(int i) {
+  return i+1;
+}
+
+void *func(void * param) {
+  for(int j=0;j<1000000;j++) {
+    pthread_spin_lock(&spinlock_global);
+    global=increment(global);
+    pthread_spin_unlock(&spinlock_global);
+  }
+  return(NULL);
+}
+
+int main (int argc, char *argv[])  {
+  pthread_t thread[NTHREADS];
+  int err;
+
+  pthread_spin_init( &spinlock_global, 0);
+
+  for(int i=0;i<NTHREADS;i++) {
+    err=pthread_create(&(thread[i]),NULL,&func,NULL);
+    if(err!=0)
+      error(err,"pthread_create");
+  }
+  for(int i=0; i<1000000000;i++) { /*...*/ }
+
+  for(int i=NTHREADS-1;i>=0;i--) {
+    err=pthread_join(thread[i],NULL);
+    if(err!=0)
+      error(err,"pthread_join");
+  }
+
+  printf("global: %ld\n",global);
+
+  return(EXIT_SUCCESS);
+}
diff --git a/_static/src/Threads/S6-src/pthread-test-if.c b/_static/src/Threads/S6-src/pthread-test-if.c
new file mode 100644
index 0000000000000000000000000000000000000000..f3fa8e26e7d22850e8fdeb06f5b9725a6f8d7a81
--- /dev/null
+++ b/_static/src/Threads/S6-src/pthread-test-if.c
@@ -0,0 +1,77 @@
+/**************************************
+ * pthread-test.c
+ *
+ * Programme d'exemple de pthread avec condition de course
+ *
+ **************************************/
+
+#include <pthread.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+
+void error(int err, char *msg) {
+  fprintf(stderr,"%s a retourné %d, message d'erreur : %s\n",msg,err,strerror(errno));
+  exit(EXIT_FAILURE);
+}
+
+
+///AAA
+
+long global=0;
+int even=0;
+int odd=0;
+
+void test_even(int i) {
+  if((i%2)==0)
+    even++;
+}
+
+int increment(int i) {
+  return i+1;
+}
+
+void *inc(void * param) {
+  for(int j=0;j<1000000;j++) {
+    global=increment(global);
+  }
+  pthread_exit(NULL);
+}
+
+void *is_even(void * param) {
+  for(int j=0;j<1000000;j++) {
+    test_even(global);
+  }
+  pthread_exit(NULL);
+}
+///BBB
+int main (int argc, char *argv[])  {
+  pthread_t thread_inc;
+  pthread_t thread_even;
+  int err;
+
+  err=pthread_create(&(thread_inc),NULL,&inc,NULL);
+  if(err!=0) {
+    error(err,"pthread_create");
+  }
+
+  err=pthread_create(&(thread_even),NULL,&is_even,NULL);
+  if(err!=0) {
+    error(err,"pthread_create");
+  }
+
+  err=pthread_join(thread_inc,NULL);
+  if(err!=0) {
+    error(err,"pthread_join");
+  }
+
+  err=pthread_join(thread_even,NULL);
+  if(err!=0) {
+    error(err,"pthread_join");
+  }
+
+  printf("global: %ld, even:%d\n",global,even);
+
+  return(EXIT_SUCCESS);
+}
diff --git a/_static/src/Threads/S6-src/pthread.c b/_static/src/Threads/S6-src/pthread.c
new file mode 100644
index 0000000000000000000000000000000000000000..9f781d0c1025d8cf28ee58734a6dc903fa44fd32
--- /dev/null
+++ b/_static/src/Threads/S6-src/pthread.c
@@ -0,0 +1,71 @@
+/**************************************
+ * pthread.c
+ *
+ * Programme d'exemple de pthread
+ *
+ **************************************/
+
+#include <pthread.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+
+int global=0;
+
+void error(int err, char *msg) {
+  fprintf(stderr,"%s a retourné %d, message d'erreur : %s\n",msg,err,strerror(errno));
+  exit(EXIT_FAILURE);
+}
+
+void *thread_first(void * param) {
+  global++;
+  return(NULL);
+}
+
+void *thread_second(void * param) {
+  global++;
+  pthread_exit(NULL);
+}
+
+int main (int argc, char *argv[])  {
+
+  ///AAA
+  pthread_t first;
+  pthread_attr_t attr_first;
+  size_t stacksize;
+
+  int err;
+
+  err= pthread_attr_init(&attr_first);
+  if(err!=0)
+    error(err,"pthread_attr_init");
+
+  err= pthread_attr_getstacksize(&attr_first,&stacksize);
+  if(err!=0)
+    error(err,"pthread_attr_getstacksize");
+
+  printf("Taille par défaut du stack : %ld\n",stacksize);
+
+  stacksize=65536;
+
+  err= pthread_attr_setstacksize(&attr_first,stacksize);
+  if(err!=0)
+    error(err,"pthread_attr_setstacksize");
+
+  err=pthread_create(&first,&attr_first,&thread_first,NULL);
+  if(err!=0)
+    error(err,"pthread_create");
+  ///BBB
+
+  for(int i=0; i<1000000000;i++) { /*...*/ }
+
+
+  err=pthread_join(first,NULL);
+    if(err!=0)
+      error(err,"pthread_join");
+
+  printf("global: %d\n",global);
+
+  return(EXIT_SUCCESS);
+}
diff --git a/_static/src/Threads/S6-src/thread_crash.c b/_static/src/Threads/S6-src/thread_crash.c
new file mode 100644
index 0000000000000000000000000000000000000000..b9f34e91dea12772b85582bcec89d1589a73245c
--- /dev/null
+++ b/_static/src/Threads/S6-src/thread_crash.c
@@ -0,0 +1,34 @@
+#include <pthread.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#define N_THREADS 3
+
+pthread_mutex_t global_mutex;
+
+static void *thread_work(void *arg)
+{
+	pthread_mutex_lock(&global_mutex);
+
+	/* Do some work here */
+
+	pthread_exit(NULL);
+	pthread_mutex_unlock(&global_mutex);
+}
+
+
+int main (int argc, char const *argv[])
+{
+	int i;
+	pthread_t threads[N_THREADS];
+
+	pthread_mutex_init(&global_mutex, NULL);
+
+	for (i = 0; i < N_THREADS; ++i)
+		pthread_create(&threads[i], NULL, thread_work, NULL);
+
+	for (i = 0; i < N_THREADS; ++i)
+		pthread_join(threads[i], NULL);
+
+	return 0;
+}
diff --git a/_static/src/Threads/S7-src/Makefile b/_static/src/Threads/S7-src/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..7a5a1577fe951aeab09924492e8d2e02b4a8efc8
--- /dev/null
+++ b/_static/src/Threads/S7-src/Makefile
@@ -0,0 +1,36 @@
+#
+# Makefile for source code
+#
+# Builds all .c files, assuming they are all independant and runs them
+# to collect the output on stdout
+#
+# Automatically builds some of the examples to be included in the text
+#
+
+GCC	= gcc
+
+CFLAGS = -Wall -std=c99 -g
+LDFLAGS = -lpthread
+
+ASMFLAGS = -Wall -std=c99 -O0 -fverbose-asm -fno-stack-protector -m32 -S
+
+CFILES := $(patsubst %.c,%.exe,$(wildcard *.c))
+ASMFILES := $(patsubst %.c,%.s,$(wildcard *.c))
+OUTPUT := $(patsubst %.c,%.out,$(wildcard *.c))
+
+
+all: ${CFILES} ${OUTPUT}
+
+%.s: %.c
+	@echo compiling $<
+	$(GCC) $(ASMFLAGS)  $<
+
+%.exe: %.c
+	@echo compiling $<
+	$(GCC) $(CFLAGS) -o $@ $< $(LDFLAGS)
+
+%.out: %.exe
+	rm -f $@
+	@echo executing $<
+	./$< >$@
+
diff --git a/_static/src/Threads/S7-src/pthread-barrier.c b/_static/src/Threads/S7-src/pthread-barrier.c
new file mode 100644
index 0000000000000000000000000000000000000000..02033916baf1f9d687c07e963a78c77d0c7faf08
--- /dev/null
+++ b/_static/src/Threads/S7-src/pthread-barrier.c
@@ -0,0 +1,70 @@
+/**************************************
+ * pthread-barrier.c
+ *
+ * Programme d'exemple de barrières
+ *
+ **************************************/
+
+#include <pthread.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+
+void error(int err, char *msg) {
+  fprintf(stderr,"%s a retourné %d, message d'erreur : %s\n",msg,err,strerror(errno));
+  exit(EXIT_FAILURE);
+}
+
+void phase1(void)
+{
+  //
+  return;
+}
+
+
+void phase2(void)
+{
+  //
+  return;
+}
+
+///AAA
+#define NTHREADS 4
+pthread_barrier_t rendezvous;
+
+void *compute(void * param) {
+  phase1();
+  pthread_barrier_wait(&rendezvous);
+  phase2();
+  return(NULL);
+}
+
+int main (int argc, char *argv[])  {
+  pthread_t thread[NTHREADS];
+  int err;
+
+  err=pthread_barrier_init(&rendezvous, NULL,NTHREADS);
+  if(err!=0) {
+      error(err,"pthread_barrier_init");
+  }
+  for(int i=0;i<NTHREADS;i++) {
+    err=pthread_create(&(thread[i]),NULL,func[i],NULL);
+    if(err!=0) {
+      error(err,"pthread_create");
+    }
+  }
+
+  for(int i=0;i<NTHREADS;i++) {
+    err=pthread_join(thread[i],NULL);
+    if(err!=0) {
+      error(err,"pthread_join");
+    }
+  }
+  pthread_barrier_destroy(&srendezvous);
+  if(err!=0) {
+      error(err,"pthread_barrier_destroy);
+  }
+  return(EXIT_SUCCESS);
+}
+///BBB
diff --git a/_static/src/Threads/S7-src/pthread-id.c b/_static/src/Threads/S7-src/pthread-id.c
new file mode 100644
index 0000000000000000000000000000000000000000..e72193fcd9e29cbc5a7c62ee9fb57bb68f75f3cf
--- /dev/null
+++ b/_static/src/Threads/S7-src/pthread-id.c
@@ -0,0 +1,95 @@
+/**************************************
+ * pthread-specific.c
+ *
+ * Programme d'exemple de pthread qui utilise une
+ * zone mémoire pour stocker des données
+ * spécifiques au thread
+ **************************************/
+
+#include <pthread.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+
+#define MAXNUM 1000
+#define NTHREADS 4
+
+struct result {
+  long x;
+  long y;
+  long z;
+};
+
+void error(int err, char *msg) {
+  fprintf(stderr,"%s a retourné %d, message d'erreur : %s\n",msg,err,strerror(errno));
+  exit(EXIT_FAILURE);
+}
+
+
+long power(long i, long j) {
+  long r=i;
+  while(j>0) {
+    r=r*i;
+    j--;
+  }
+  return r;
+}
+
+void g();
+
+void *f1( void* param) {
+
+  printf("f1 a calculé %d"
+  return(NULL);
+}
+
+
+void *fermat (void * param) {
+
+  struct result *r=(struct result *)malloc(sizeof(struct result));
+  if(r==NULL)
+    error(-1,"malloc");
+
+  long n=(long) param;
+  for(long x=1;x<MAXNUM;x++) {
+    for(long y=1;y<MAXNUM;y++) {
+      for(int z=1;z<MAXNUM;z++) {
+	if( (power(x,n)+power(y,n))==power(z,n) ) {
+	      r->x=x;
+	      r->y=y;
+	      r->z=z;
+	      return((void *) r);
+	}
+      }
+    }
+  }
+  return(NULL);
+}
+
+int main (int argc, char *argv[])  {
+  pthread_t threads[NTHREADS];
+  int err;
+
+  err=pthread_create(&(threads[i]),NULL,&fermat,(void *)(long) i+2);
+  if(err!=0)
+    error(err,"pthread_create");
+
+
+
+
+  for(int i=0;i<NTHREADS;i++) {
+    void *p;
+    err=pthread_join(threads[i],(void **)&(p));
+
+    if(err!=0)
+      error(err,"pthread_create");
+    //if(p!=NULL) {
+    //struct result r;
+      //      r=(struct result) p;
+      //printf("Trouvé pour %d : x=%ld, y=%ld, z=%ld\n",i+2,r[i].x,r[i].y, r[i].z);
+  }
+
+
+  return(EXIT_SUCCESS);
+}
diff --git a/_static/src/Threads/S7-src/pthread-philo-sem.c b/_static/src/Threads/S7-src/pthread-philo-sem.c
new file mode 100644
index 0000000000000000000000000000000000000000..8d27d804b61277834c87a0cbc9d095413a8076a8
--- /dev/null
+++ b/_static/src/Threads/S7-src/pthread-philo-sem.c
@@ -0,0 +1,69 @@
+/**************************************
+ * pthread-philo-sem.c
+ *
+ * Programme d'exemple de pthread avec
+ * philosophes qui dinent et sémaphores
+ *
+ **************************************/
+
+///AAA
+#include <pthread.h>
+#include <semaphore.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdbool.h>
+#include <unistd.h>
+
+#define PHILOSOPHES 3
+
+pthread_t phil[PHILOSOPHES];
+sem_t baguette[PHILOSOPHES];
+
+void mange(int id) {
+  printf("Philosophe [%d] mange\n",id);
+  for(int i=0;i< rand(); i++) {
+    // philosophe mange
+  }
+}
+
+void* philosophe ( void* arg )
+{
+  int *id=(int *) arg;
+  int left = *id;
+  int right = (left + 1) % PHILOSOPHES;
+  while(true) {
+    printf("Philosophe [%d] pense\n",*id);
+    sem_wait(&baguette[left]);
+    printf("Philosophe [%d] possède baguette gauche [%d]\n",*id,left);
+    sem_wait(&baguette[right]);
+    printf("Philosophe [%d] possède baguette droite [%d]\n",*id,right);
+    mange(*id);
+    sem_post(&baguette[left]);
+    printf("Philosophe [%d] a libéré baguette gauche [%d]\n",*id,left);
+    sem_post(&baguette[right]);
+    printf("Philosophe [%d] a libéré baguette droite [%d]\n",*id,right);
+  }
+  return (NULL);
+}
+///BBB
+int main ( int argc, char *argv[])
+{
+   long i;
+   int id[PHILOSOPHES];
+
+   srand(getpid());
+
+   for (i = 0; i < PHILOSOPHES; i++)
+     id[i]=i;
+
+   for (i = 0; i < PHILOSOPHES; i++)
+     sem_init( &baguette[i], 0 , 1);
+
+   for (i = 0; i < PHILOSOPHES; i++)
+     pthread_create(&phil[i], NULL, philosophe, (void*)&(id[i]) );
+
+   for (i = 0; i < PHILOSOPHES; i++)
+      pthread_join(phil[i], NULL);
+
+   return (EXIT_SUCCESS);
+}
diff --git a/_static/src/Threads/S7-src/pthread-rw.c b/_static/src/Threads/S7-src/pthread-rw.c
new file mode 100644
index 0000000000000000000000000000000000000000..22ab9328c59805f43bba9f2804d8edbf3f295143
--- /dev/null
+++ b/_static/src/Threads/S7-src/pthread-rw.c
@@ -0,0 +1,76 @@
+/**************************************
+ * pthread-rw.c
+ *
+ * Programme d'exemple de pthread avec
+ * readers-writers lock
+ *
+ **************************************/
+
+#include <pthread.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdbool.h>
+#include <unistd.h>
+#include <sys/types.h>
+
+#define SIZE 1000000
+#define READERS 10
+#define WRITERS 2
+#define LOOP 10000
+
+
+pthread_t p[READERS+WRITERS];
+pthread_rwlock_t lock;
+
+volatile int v[SIZE];
+
+void *writer( void *arg)
+{
+  for(int i=0;i<SIZE;i++) {
+    pthread_rwlock_wrlock(&lock);
+    v[i]=rand()%SIZE;
+    pthread_rwlock_wrunlock(&lock);
+  }
+  // ...
+  printf ("Writer %d terminé\n",gettid());
+  return(NULL);
+
+
+}
+void* reader ( void* arg )
+{
+  int result;
+  for(int i=0;i<LOOP;i++) {
+    int id=rand()%SIZE;
+    pthread_rwlock_rdlock(&lock);
+    result=v[id];
+    pthread_rwlock_rdunlock(&lock);
+  }
+  // ...
+  printf ("Reader %d terminé\n",gettid());
+  return(NULL);
+}
+
+///BBB
+int main ( int argc, char *argv[])
+{
+   int i;
+
+   srand(getpid());
+
+   pthread_rwlock_init(&lock, 0);
+
+   for (i = 0; i < READERS+WRITERS; i++) {
+     if(i<READERS)
+       pthread_create(&p[i], NULL, reader, NULL );
+     else
+       pthread_create(&p[i], NULL, writer, NULL );
+   }
+
+   for (i = 0; i < READERS+WRITERS; i++)
+     pthread_join(p[i], NULL);
+
+   pthread_rwlock_destroy(&lock);
+
+   return (EXIT_SUCCESS);
+}
diff --git a/_static/src/Threads/S7-src/pthread-sem-before.c b/_static/src/Threads/S7-src/pthread-sem-before.c
new file mode 100644
index 0000000000000000000000000000000000000000..fd4567586f1ccd5c72a0b7e29848e960b898c6d9
--- /dev/null
+++ b/_static/src/Threads/S7-src/pthread-sem-before.c
@@ -0,0 +1,70 @@
+/**************************************
+ * pthread-sem-before.c
+ *
+ * Programme d'exemple de sémaphores
+ * La fonction after ne peut s'exécuter
+ * q'après la fonction before
+ **************************************/
+
+#include <pthread.h>
+#include <semaphore.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+
+void error(int err, char *msg) {
+  fprintf(stderr,"%s a retourné %d, message d'erreur : %s\n",msg,err,strerror(errno));
+  exit(EXIT_FAILURE);
+}
+
+
+///AAA
+#define NTHREADS 2
+sem_t semaphore;
+
+void *before(void * param) {
+  // do something
+  for(int j=0;j<1000000;j++) {
+  }
+  sem_post(&semaphore);
+  return(NULL);
+}
+
+void *after(void * param) {
+  sem_wait(&semaphore);
+  // do something
+  for(int j=0;j<1000000;j++) {
+  }
+  return(NULL);
+}
+
+int main (int argc, char *argv[])  {
+  pthread_t thread[NTHREADS];
+  void * (* func[])(void *)={before, after};
+  int err;
+
+  err=sem_init(&semaphore, 0,0);
+  if(err!=0) {
+      error(err,"sem_init");
+  }
+  for(int i=0;i<NTHREADS;i++) {
+    err=pthread_create(&(thread[i]),NULL,func[i],NULL);
+    if(err!=0) {
+      error(err,"pthread_create");
+    }
+  }
+
+  for(int i=0;i<NTHREADS;i++) {
+    err=pthread_join(thread[i],NULL);
+    if(err!=0) {
+      error(err,"pthread_join");
+    }
+  }
+  sem_destroy(&semaphore);
+  if(err!=0) {
+      error(err,"sem_destroy");
+  }
+  return(EXIT_SUCCESS);
+}
+///BBB
diff --git a/_static/src/Threads/S7-src/pthread-sem-before.out b/_static/src/Threads/S7-src/pthread-sem-before.out
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/_static/src/Threads/S7-src/pthread-sem.c b/_static/src/Threads/S7-src/pthread-sem.c
new file mode 100644
index 0000000000000000000000000000000000000000..28890557548e5cdba7a052918cd5febf8c4fbe57
--- /dev/null
+++ b/_static/src/Threads/S7-src/pthread-sem.c
@@ -0,0 +1,64 @@
+/**************************************
+ * pthread-semt.c
+ *
+ * Programme d'exemple de sémaphores
+ *
+ **************************************/
+
+#include <pthread.h>
+#include <semaphore.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+
+#define NTHREADS 4
+
+void error(int err, char *msg) {
+  fprintf(stderr,"%s a retourné %d, message d'erreur : %s\n",msg,err,strerror(errno));
+  exit(EXIT_FAILURE);
+}
+
+
+///AAA
+
+static sem_t semaphore;
+long global=0;
+
+int increment(int i) {
+  return i+1;
+}
+
+void *inc(void * param) {
+  for(int j=0;j<1000000;j++) {
+    sem_wait(&semaphore);
+    global=increment(global);
+    sem_post(&semaphore);
+  }
+  pthread_exit(NULL);
+}
+
+int main (int argc, char *argv[])  {
+  pthread_t thread[NTHREADS];
+  int err;
+
+  sem_init(&semaphore, 0,1);
+
+  for(int i=0;i<NTHREADS;i++) {
+    err=pthread_create(&(thread[i]),NULL,&inc,NULL);
+    if(err!=0) {
+      error(err,"pthread_create");
+    }
+  }
+
+  for(int i=0;i<NTHREADS;i++) {
+    err=pthread_join(thread[i],NULL);
+    if(err!=0) {
+      error(err,"pthread_join");
+    }
+  }
+  sem_destroy(&semaphore);
+  printf("global: %ld\n",global);
+
+  return(EXIT_SUCCESS);
+}
diff --git a/_static/src/Threads/S7-src/pthread-sem.out b/_static/src/Threads/S7-src/pthread-sem.out
new file mode 100644
index 0000000000000000000000000000000000000000..cb6ea05e0fe7b70523a0556e88ea20481eb28b72
--- /dev/null
+++ b/_static/src/Threads/S7-src/pthread-sem.out
@@ -0,0 +1 @@
+global: 3837069
diff --git a/_static/src/Threads/S7-src/pthread-specific.c b/_static/src/Threads/S7-src/pthread-specific.c
new file mode 100644
index 0000000000000000000000000000000000000000..38a347a126aa561951e49e6e782aa2a41eb8dd55
--- /dev/null
+++ b/_static/src/Threads/S7-src/pthread-specific.c
@@ -0,0 +1,56 @@
+/**************************************
+ * pthread-specific.c
+ *
+ * Programme d'exemple de pthread qui utilise une
+ * zone mémoire pour stocker des données
+ * spécifiques au thread
+ **************************************/
+
+#include <pthread.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+
+void error(int err, char *msg) {
+  fprintf(stderr,"%s a retourné %d, message d'erreur : %s\n",msg,err,strerror(errno));
+  exit(EXIT_FAILURE);
+}
+
+
+///AAA
+#define LOOP 1000000
+#define NTHREADS 4
+
+__thread int count=0;
+int global_count=0;
+
+void *f( void* param) {
+  for(int i=0;i<LOOP;i++) {
+    count++;
+    global_count=global_count-1;
+  }
+  printf("Valeurs : count=%d, global_count=%d\n",count, global_count);
+  return(NULL);
+}
+
+int main (int argc, char *argv[])  {
+  pthread_t threads[NTHREADS];
+  int err;
+
+  for(int i=0;i<NTHREADS;i++) {
+    count=i;   // local au thread du programme principal
+    err=pthread_create(&(threads[i]),NULL,&f,NULL);
+    if(err!=0)
+      error(err,"pthread_create");
+  }
+
+  for(int i=0;i<NTHREADS;i++) {
+    err=pthread_join(threads[i],NULL);
+    if(err!=0)
+      error(err,"pthread_create");
+  }
+
+  return(EXIT_SUCCESS);
+}
+///BBB
diff --git a/_static/src/Threads/S7-src/pthread-specific.out b/_static/src/Threads/S7-src/pthread-specific.out
new file mode 100644
index 0000000000000000000000000000000000000000..f0eb4d4432d5c6cd658ac2ff16f2487c2334216f
--- /dev/null
+++ b/_static/src/Threads/S7-src/pthread-specific.out
@@ -0,0 +1,4 @@
+Valeurs : count=1000000, global_count=-870754
+Valeurs : count=1000000, global_count=-880737
+Valeurs : count=1000000, global_count=-916383
+Valeurs : count=1000000, global_count=-923423
diff --git a/_static/src/Threads/S7-src/pthread-specific2.c b/_static/src/Threads/S7-src/pthread-specific2.c
new file mode 100644
index 0000000000000000000000000000000000000000..47cec0223ad8ae4f692c67f61fc754d46c731cfa
--- /dev/null
+++ b/_static/src/Threads/S7-src/pthread-specific2.c
@@ -0,0 +1,77 @@
+/**************************************
+ * pthread-specific.c
+ *
+ * Programme d'exemple de pthread qui utilise une
+ * zone mémoire pour stocker des données
+ * spécifiques au thread
+ **************************************/
+
+#include <pthread.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+
+void error(int err, char *msg) {
+  fprintf(stderr,"%s a retourné %d, message d'erreur : %s\n",msg,err,strerror(errno));
+  exit(EXIT_FAILURE);
+}
+
+
+///AAA
+#define LOOP 1000000
+#define NTHREADS 4
+
+pthread_key_t count;
+int global_count=0;
+
+void g(void ) {
+  void * data=pthread_getspecific(count);
+  if(data==NULL)
+    error(-1,"pthread_getspecific");
+  int *count_ptr=(int *)data;
+  for(int i=0;i<LOOP;i++) {
+    *count_ptr=*(count_ptr)+1;
+    global_count=global_count-1;
+  }
+}
+
+void *f( void* param) {
+  int err;
+  int *int_ptr=malloc(sizeof(int));
+  *int_ptr=0;
+  err=pthread_setspecific(count, (void *)int_ptr);
+  if(err!=0)
+    error(err,"pthread_setspecific");
+  g();
+  printf("Valeurs : count=%d, global_count=%d\n",*int_ptr, global_count);
+  free(int_ptr);
+  return(NULL);
+}
+
+int main (int argc, char *argv[])  {
+  pthread_t threads[NTHREADS];
+  int err;
+
+  err=pthread_key_create(&(count),NULL);
+  if(err!=0)
+    error(err,"pthread_key_create");
+
+  for(int i=0;i<NTHREADS;i++) {
+    err=pthread_create(&(threads[i]),NULL,&f,NULL);
+    if(err!=0)
+      error(err,"pthread_create");
+  }
+
+  for(int i=0;i<NTHREADS;i++) {
+    err=pthread_join(threads[i],NULL);
+    if(err!=0)
+      error(err,"pthread_create");
+  }
+  err=pthread_key_delete(count);
+  if(err!=0)
+    error(err,"pthread_key_delete");
+
+  return(EXIT_SUCCESS);
+}
+///BBB
diff --git a/_static/src/Threads/S7-src/pthread-specific2.out b/_static/src/Threads/S7-src/pthread-specific2.out
new file mode 100644
index 0000000000000000000000000000000000000000..c717fae88a16bed9a2e7040da20f76e80ee5e0be
--- /dev/null
+++ b/_static/src/Threads/S7-src/pthread-specific2.out
@@ -0,0 +1,4 @@
+Valeurs : count=1000000, global_count=-970217
+Valeurs : count=1000000, global_count=-2967957
+Valeurs : count=1000000, global_count=-2978745
+Valeurs : count=1000000, global_count=-3135210
diff --git a/_static/src/Threads/S7-src/reentrant.c b/_static/src/Threads/S7-src/reentrant.c
new file mode 100644
index 0000000000000000000000000000000000000000..89743445840f46c42dd7ec9331d6843bec7f5630
--- /dev/null
+++ b/_static/src/Threads/S7-src/reentrant.c
@@ -0,0 +1,63 @@
+/**************************************
+ * reentrant.c
+ *
+ * Programme d'exemple de fonctions reentrantes
+ *
+ **************************************/
+
+#include <pthread.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+
+
+///AAA
+#include <stdint.h>
+#define SIZE 10000
+
+int g_max=INT32_MIN;
+int v[SIZE];
+
+int max_vector(int n, int *v) {
+  int max=INT32_MIN;
+  for(int i=0;i<n;i++) {
+    if(v[i]>max)
+      max=v[i];
+  }
+  return max;
+}
+
+int max_global(int *v) {
+    if (*v>g_max) {
+      g_max=*v;
+    }
+    return(g_max);
+}
+
+int max_static(int *v){
+  static int s_max=INT32_MIN;
+  if (*v>s_max) {
+    s_max=*v;
+  }
+  return(s_max);
+}
+
+///BBB
+
+int main (int argc, char *argv[])  {
+  srand((int) getpid());
+  for (int i=0;i<SIZE;i++) {
+    v[i]=rand()%1000000;
+  }
+  printf("max_vector: %d\n",max_vector(SIZE,v));
+  int max_g;
+  int max_s;
+  for(int i=0;i<SIZE;i++) {
+    max_g=max_global(&v[i]);
+    max_s=max_static(&v[i]);
+  }
+  printf("max_global: %d\n",max_g);
+  printf("max_static: %d\n",max_s);
+
+  return(EXIT_SUCCESS);
+}
diff --git a/_static/src/Threads/S7-src/strerror.c b/_static/src/Threads/S7-src/strerror.c
new file mode 100644
index 0000000000000000000000000000000000000000..a1571c52fdea21e2ad2003a79ccaa430417a4ed0
--- /dev/null
+++ b/_static/src/Threads/S7-src/strerror.c
@@ -0,0 +1,21 @@
+/**************************************
+ * strerror.c
+ *
+ * Programme d'exemple strerror
+ *
+ **************************************/
+
+#include <pthread.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+
+int main (int argc, char *argv[])  {
+
+  for(int i=0; i<999;i++) {
+    printf("strerror[%d] est à l'adresse %p\n",i,strerror(i));
+  };
+
+  return(EXIT_SUCCESS);
+}
diff --git a/_static/src/Threads/S8-src/Makefile b/_static/src/Threads/S8-src/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..7a5a1577fe951aeab09924492e8d2e02b4a8efc8
--- /dev/null
+++ b/_static/src/Threads/S8-src/Makefile
@@ -0,0 +1,36 @@
+#
+# Makefile for source code
+#
+# Builds all .c files, assuming they are all independant and runs them
+# to collect the output on stdout
+#
+# Automatically builds some of the examples to be included in the text
+#
+
+GCC	= gcc
+
+CFLAGS = -Wall -std=c99 -g
+LDFLAGS = -lpthread
+
+ASMFLAGS = -Wall -std=c99 -O0 -fverbose-asm -fno-stack-protector -m32 -S
+
+CFILES := $(patsubst %.c,%.exe,$(wildcard *.c))
+ASMFILES := $(patsubst %.c,%.s,$(wildcard *.c))
+OUTPUT := $(patsubst %.c,%.out,$(wildcard *.c))
+
+
+all: ${CFILES} ${OUTPUT}
+
+%.s: %.c
+	@echo compiling $<
+	$(GCC) $(ASMFLAGS)  $<
+
+%.exe: %.c
+	@echo compiling $<
+	$(GCC) $(CFLAGS) -o $@ $< $(LDFLAGS)
+
+%.out: %.exe
+	rm -f $@
+	@echo executing $<
+	./$< >$@
+
diff --git a/_static/src/Threads/S8-src/Makefile-lib b/_static/src/Threads/S8-src/Makefile-lib
new file mode 100644
index 0000000000000000000000000000000000000000..6cbf869aa0354706af10c9a5ddd0b3bb98e9ab15
--- /dev/null
+++ b/_static/src/Threads/S8-src/Makefile-lib
@@ -0,0 +1,30 @@
+#
+# Makefile for library imax and imath
+#
+
+GCC	= gcc
+AR	= ar
+ARFLAGS = -cvq
+CFLAGS = -Wall -std=c99 -g -c
+LDFLAGS = --static -g
+
+all: imath
+
+imax.o: imax.c
+	@echo compiling imax
+	$(GCC) $(CFLAGS) imax.c
+
+libimax.a: imax.o
+	@echo building libimax
+	$(AR) $(ARFLAGS) libimax.a imax.o
+
+imath.o: imath.c imax.h
+	@echo compiling imath.o
+	$(GCC) $(CFLAGS) imath.c
+
+imath: imath.o libimax.a
+	@echo building imath
+	$(GCC) $(LDFLAGS)  -o imath libimax.a imath.o
+
+clean:
+	rm imath libimax.a imax.o imath.o
diff --git a/_static/src/Threads/S8-src/atexit.c b/_static/src/Threads/S8-src/atexit.c
new file mode 100644
index 0000000000000000000000000000000000000000..deb7367e8301e57e585a929ad7c0e54a913b92b6
--- /dev/null
+++ b/_static/src/Threads/S8-src/atexit.c
@@ -0,0 +1,27 @@
+/**************************************
+ * atexit.c
+ *
+ * Programme d'exemple d'utilisation de
+ * atexit
+ *
+ *************************************/
+///AAA
+#include <stdio.h>
+#include <stdlib.h>
+
+void e1() {
+  printf("Exécution de la fonction e1\n");
+}
+
+int main (int argc, char *argv[])  {
+
+  int err;
+  err=atexit(e1);
+  if(err==-1) {
+    perror("atexit");
+    exit(EXIT_FAILURE);
+  }
+  return(EXIT_SUCCESS);
+
+}
+///BBB
diff --git a/_static/src/Threads/S8-src/execve-long.c b/_static/src/Threads/S8-src/execve-long.c
new file mode 100644
index 0000000000000000000000000000000000000000..0b5e7916dd31dee8385f92d3db6df24818c8c01e
--- /dev/null
+++ b/_static/src/Threads/S8-src/execve-long.c
@@ -0,0 +1,32 @@
+/**************************************
+ * execve-long.c
+ *
+ * Programme d'exemple pour execve
+ *
+ *************************************/
+
+///AAA
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <errno.h>
+#include <string.h>
+
+extern char **environ;
+
+int main (int argc, char *argv[])  {
+
+  if(argc==1) {
+    fprintf(stderr,"Erreur, nom de l'exécutable nécessaire\n");
+    return(EXIT_FAILURE);
+  }
+
+  int err=execve(argv[1], &(argv[1]), environ);
+  if(err!=0) {
+    fprintf(stderr,"Impossible d'exécuter %s, erreur %d %s\n",argv[1],err, strerror(errno));
+    exit(EXIT_FAILURE);
+  }
+  return(EXIT_SUCCESS);
+
+}
+
diff --git a/_static/src/Threads/S8-src/execve.c b/_static/src/Threads/S8-src/execve.c
new file mode 100644
index 0000000000000000000000000000000000000000..64367f79f0b8db5996b6b5a25a57b04206b62a7c
--- /dev/null
+++ b/_static/src/Threads/S8-src/execve.c
@@ -0,0 +1,30 @@
+/**************************************
+ * execve.c
+ *
+ * Programme d'exemple pour execve
+ *
+ *************************************/
+
+///AAA
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+int main (int argc, char *argv[])  {
+
+  char *arguments[]={"expr", "1", "+", "2", NULL};
+  char *environnement[]={"LANG=fr",NULL};
+
+  printf("Exécution du processus %d\n",getpid());
+  printf("Exécution de /usr/bin/expr\n");
+  int err=execve("/usr/bin/expr", arguments, environnement);
+  if(err!=0) {
+    perror("execve");
+    exit(EXIT_FAILURE);
+  }
+  // jamais atteint
+  printf("Ce message ne sera jamais affiché\n");
+  return(EXIT_SUCCESS);
+
+}
+
diff --git a/_static/src/Threads/S8-src/execve.out b/_static/src/Threads/S8-src/execve.out
new file mode 100644
index 0000000000000000000000000000000000000000..00750edc07d6415dcc07ae0351e9397b0222b7ba
--- /dev/null
+++ b/_static/src/Threads/S8-src/execve.out
@@ -0,0 +1 @@
+3
diff --git a/_static/src/Threads/S8-src/fork-buf.c b/_static/src/Threads/S8-src/fork-buf.c
new file mode 100644
index 0000000000000000000000000000000000000000..718004df8a0181b578017599dee900be7c67bd8f
--- /dev/null
+++ b/_static/src/Threads/S8-src/fork-buf.c
@@ -0,0 +1,58 @@
+/**************************************
+ * fork.c
+ *
+ * Programme d'exemple d'utilisation de
+ * fork
+ *
+ *************************************/
+///AAA
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <time.h>
+
+
+void output(char c) {
+  printf("Processus : %d\n",getpid());
+  srand(getpid()+time(NULL));
+  for(int i=0;i<60;i++) {
+    putchar(c);
+    int err=usleep((unsigned int) (rand()%10000));
+    if(err<0) {
+      perror("usleep");
+      exit(EXIT_FAILURE);
+    }
+  }
+}
+
+int main (int argc, char *argv[])  {
+
+  if(argc > 1) {
+    setbuf(stdout,NULL);
+  }
+
+  pid_t pid;
+
+  pid=fork();
+  if (pid==-1) {
+    // erreur à l'exécution de fork
+    perror("fork");
+    exit(EXIT_FAILURE);
+  }
+  // pas d'erreur
+  if (pid==0) {
+    // processus fils
+    output('f');
+    return(EXIT_SUCCESS);
+  }
+  else {
+    // processus père
+    output('P');
+    printf("\n");
+    sleep(1);
+    // ...
+    return(EXIT_SUCCESS);
+  }
+}
+///BBB
diff --git a/_static/src/Threads/S8-src/fork-execve.c b/_static/src/Threads/S8-src/fork-execve.c
new file mode 100644
index 0000000000000000000000000000000000000000..52e771c15271001b8c48b511236e847bb3b1c231
--- /dev/null
+++ b/_static/src/Threads/S8-src/fork-execve.c
@@ -0,0 +1,57 @@
+/**************************************
+ * fork-execve.c
+ *
+ * Programme d'exemple d'utilisation de
+ * fork et execve
+ *
+ *************************************/
+///AAA
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/wait.h>
+#include <sys/types.h>
+
+
+int main (int argc, char *argv[])  {
+  int status;
+  pid_t pid;
+
+  pid=fork();
+
+  if (pid==-1) {
+    // erreur à l'exécution de fork
+    perror("fork");
+    exit(EXIT_FAILURE);
+  }
+  // pas d'erreur
+  if (pid==0) {
+    // fils
+    char *arguments[]={"expr", "1", "+", "2", NULL};
+    char *environnement[]={"PATH=/bin:/usr/bin",NULL};
+    int err=execve("/usr/bin/expr", arguments, environnement);
+    if(err!=0) {
+      perror("execve");
+      return(EXIT_FAILURE);
+    }
+  }
+  else {
+    // processus père
+    int fils=waitpid(pid,&status,0);
+    if(fils==-1) {
+      perror("wait");
+      exit(EXIT_FAILURE);
+    }
+    if(WIFEXITED(status)) {
+      printf("Le fils %d s'est terminé correctement et a retourné la valeur %d\n",fils,WEXITSTATUS(status));
+      return(EXIT_SUCCESS);
+    }
+    else {
+      if( WIFSIGNALED(status)) {
+	printf("Le fils %d a été tué par le signal %d\n",fils,WTERMSIG(status));
+      }
+      return(EXIT_FAILURE);
+    }
+  }
+}
+///BBB
diff --git a/_static/src/Threads/S8-src/fork-manyexec.c b/_static/src/Threads/S8-src/fork-manyexec.c
new file mode 100644
index 0000000000000000000000000000000000000000..b0742d45b66bd85e56c17d3626626e3db0cbf431
--- /dev/null
+++ b/_static/src/Threads/S8-src/fork-manyexec.c
@@ -0,0 +1,64 @@
+/**************************************
+ * fork-manyexec.c
+ *
+ * Programme d'exemple d'utilisation de
+ * fork et execve
+ *
+ *************************************/
+///AAA
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/wait.h>
+#include <sys/types.h>
+#include <libgen.h>
+
+extern char **environ;
+
+int main (int argc, char *argv[])  {
+  int status;
+  pid_t pid;
+
+  for(int i=1;i<argc;i++) {
+    // création du fils
+    pid=fork();
+    if (pid==-1) {
+      perror("fork");
+      exit(EXIT_FAILURE);
+    }
+    if (pid==0) {
+      // fils
+      printf ("Exécution de la commande %s [pid=%d]\n",argv[i],getpid());
+      fflush(stdout);
+      char *arguments[2];
+      arguments[0]=basename(argv[i]);
+      arguments[1]=NULL;
+      int err=execve(argv[i], arguments, environ);
+      if(err!=0)
+	return(127);
+    } // fils
+    else {
+      // processus père
+      int fils=waitpid(pid,&status,0);
+      if(fils==-1) {
+	perror("wait");
+	exit(EXIT_FAILURE);
+      }
+      if(WIFEXITED(status)) {
+	if(WEXITSTATUS(status)==0)
+	  printf("La commande %s [%d] s'est terminée correctement\n",argv[i],fils);
+	else
+	  if (WEXITSTATUS(status)==127)
+	    printf("La commande %s n'a pu être exécutée\n",argv[i]);
+	  else
+	    printf("La commande %s [%d] a retourné %d\n",argv[i],fils,WEXITSTATUS(status));
+      }
+      else {
+	if( WIFSIGNALED(status))
+	  printf("La commande %s [%d] ne s'est pas terminée correctement\n",argv[i],fils);
+      }
+      fflush(stdout);
+    } // père
+  } // for loop
+  return(EXIT_SUCCESS);
+}
diff --git a/_static/src/Threads/S8-src/fork-manyexec.out b/_static/src/Threads/S8-src/fork-manyexec.out
new file mode 100644
index 0000000000000000000000000000000000000000..942f0cdf2a69fa0ddd52340e28f0feb9392b0884
--- /dev/null
+++ b/_static/src/Threads/S8-src/fork-manyexec.out
@@ -0,0 +1,7 @@
+$./fork-manyexec /bin/true /bin/false /bin/none
+Exécution de la commande /bin/true [pid=14217]
+La commande /bin/true [14217] s'est terminée correctement
+Exécution de la commande /bin/false [pid=14218]
+La commande /bin/false [14218] a retourné 1
+Exécution de la commande /bin/none [pid=14219]
+La commande /bin/none n'a pu être exécutée
diff --git a/_static/src/Threads/S8-src/fork-nice.c b/_static/src/Threads/S8-src/fork-nice.c
new file mode 100644
index 0000000000000000000000000000000000000000..e746a7d109259baf9e316f8fbff860c1dff12229
--- /dev/null
+++ b/_static/src/Threads/S8-src/fork-nice.c
@@ -0,0 +1,67 @@
+/**************************************
+ * fork-zombie.c
+ *
+ * Programme d'exemple d'utilisation de
+ * fork qui crée un zombie
+ *
+ *************************************/
+///AAA
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/wait.h>
+#include <sys/types.h>
+
+void usage() {
+  printf("Usage :\n");
+  printf("prog -p num\navec num entier\n");
+
+}
+
+int main (int argc, char *argv[])  {
+  pid_t pid;
+  char *endptr, *str;
+  int err;
+  int ch;
+  int priority;
+  while ((ch = getopt(argc, argv, "p:")) != -1) {
+    switch (ch) {
+    case 'p':
+      priority=(int) strtol(optarg, &endptr, 10);
+      if( (priority < 0) || (priority >20) ) {
+	printf("La priorité doit être comprise entre 0 et 20\n");
+      }
+      return(EXIT_FAILURE);
+      break;
+    case '?':
+    default:
+      usage();
+      return(EXIT_FAILURE);
+    }
+  }
+  pid=fork();
+
+  if (pid==-1) {
+    // erreur à l'exécution de fork
+    perror("fork");
+    exit(EXIT_FAILURE);
+  }
+  // pas d'erreur
+  if (pid==0) {
+    // fils
+    printf("pid du zombie: %d\n",getpid());
+    return(EXIT_SUCCESS);
+  }
+  else {
+    // processus père
+    sleep(50);
+    err=wait(NULL);
+    if(err!=0) {
+      perror("fork");
+      exit(EXIT_FAILURE);
+    }
+    printf("Fin du processus père [%d]\n",getpid());
+    return(EXIT_SUCCESS);
+  }
+}
+///BBB
diff --git a/_static/src/Threads/S8-src/fork-orphan.c b/_static/src/Threads/S8-src/fork-orphan.c
new file mode 100644
index 0000000000000000000000000000000000000000..751d5a123d9035862047b6308b1fc894eaef63af
--- /dev/null
+++ b/_static/src/Threads/S8-src/fork-orphan.c
@@ -0,0 +1,41 @@
+/**************************************
+ * fork-ophan.c
+ *
+ * Programme d'exemple d'utilisation de
+ * fork avec fils orphelin
+ *
+ *************************************/
+///AAA
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/wait.h>
+#include <sys/types.h>
+
+
+int main (int argc, char *argv[])  {
+  pid_t pid;
+
+  pid=fork();
+
+  if (pid==-1) {
+    // erreur à l'exécution de fork
+    perror("fork");
+    exit(EXIT_FAILURE);
+  }
+  // pas d'erreur
+  if (pid==0) {
+    printf("Processus : %d, père : %d\n",getpid(),getppid());
+    fflush(stdout);
+    sleep(3);
+    printf("Processus : %d, père : %d\n",getpid(),getppid());
+    return(EXIT_SUCCESS);
+  }
+  else {
+    // processus père
+    sleep(1);
+    printf("Fin du processus père [%d]\n",getpid());
+    return(EXIT_FAILURE);
+  }
+}
+///BBB
diff --git a/_static/src/Threads/S8-src/fork-orphan.out b/_static/src/Threads/S8-src/fork-orphan.out
new file mode 100644
index 0000000000000000000000000000000000000000..6f5395e9eb46edac55b814bb46d43ca9149d7990
--- /dev/null
+++ b/_static/src/Threads/S8-src/fork-orphan.out
@@ -0,0 +1,3 @@
+Processus : 28750, père : 28749
+Fin du processus père [28749]
+Processus : 28750, père : 1
diff --git a/_static/src/Threads/S8-src/fork-perf.c b/_static/src/Threads/S8-src/fork-perf.c
new file mode 100644
index 0000000000000000000000000000000000000000..3c330d9569d6b947e69c2f0c557656898257f01b
--- /dev/null
+++ b/_static/src/Threads/S8-src/fork-perf.c
@@ -0,0 +1,47 @@
+/**************************************
+ * fork-perf.c
+ *
+ * Programme d'exemple pour calculer le coût
+ * de fork
+ *
+ *************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/wait.h>
+#include <sys/types.h>
+
+#define N 100000
+
+int main (int argc, char *argv[])  {
+  int status;
+  pid_t pid;
+
+  for(int i=0;i<N;i++) {
+    pid=fork();
+    if (pid==-1) {
+      // erreur à l'exécution de fork
+      perror("fork");
+      exit(EXIT_FAILURE);
+    }
+    // pas d'erreur
+    if (pid==0) {
+      return(EXIT_SUCCESS);
+    }
+    else {
+      int fils=waitpid(pid,&status,0);
+      if(fils==-1) {
+	perror("wait");
+	exit(EXIT_FAILURE);
+      }
+      if(!WIFEXITED(status)) {
+	fprintf(stderr,"Erreur de waitpid\n");
+	exit(EXIT_FAILURE);
+      }
+    }
+  }
+  return(EXIT_SUCCESS);
+
+}
+
diff --git a/_static/src/Threads/S8-src/fork-pthread.c b/_static/src/Threads/S8-src/fork-pthread.c
new file mode 100644
index 0000000000000000000000000000000000000000..ebb9b6d6bd6e9580d7942c92af6167ba8d2a993b
--- /dev/null
+++ b/_static/src/Threads/S8-src/fork-pthread.c
@@ -0,0 +1,78 @@
+/**************************************
+ * fork-pthread.c
+ *
+ * Programme d'exemple pour voir le contenu de /proc
+ *
+ *************************************/
+
+#define _GNU_SOURCE
+#include <stdio.h>
+#include <stdlib.h>
+#include <pthread.h>
+#include <unistd.h>
+#include <sys/wait.h>
+#include <sys/types.h>
+#include <sys/syscall.h>
+
+#define DELAY 600
+
+pid_t gettid() {
+    pid_t tid;
+    tid = syscall(SYS_gettid);
+    return tid;
+}
+
+
+void *func(void * param) {
+  int slept=DELAY;
+  printf("thread : %d\n",gettid());
+  fflush(stdout);
+  while((slept=sleep(slept))!=0) ;
+  pthread_exit(NULL);
+}
+
+int main (int argc, char *argv[])  {
+  int err;
+  pid_t pid;
+  int status;
+  pthread_t thread;
+  int slept=DELAY;
+  printf("père : %d\n",getpid());
+  fflush(stdout);
+  pid=fork();
+  if (pid==-1) {
+    perror("fork");
+    exit(EXIT_FAILURE);
+  }
+  if (pid==0) {
+    // fils
+    printf("fils : %d\n",getpid());
+    fflush(stdout);
+    while((slept=sleep(slept))!=0) ;
+    return(EXIT_SUCCESS);
+  }
+  else {
+    // père
+    err=pthread_create(&(thread),NULL,&func,NULL);
+    if(err!=0) {
+      perror("pthread_create");
+      exit(EXIT_FAILURE);
+    }
+    err=pthread_join(thread,NULL);
+    if(err!=0) {
+      perror("pthread_join");
+      exit(EXIT_FAILURE);
+    }
+    int fils=waitpid(pid,&status,0);
+    if(fils==-1) {
+      perror("wait");
+      exit(EXIT_FAILURE);
+    }
+    if(!WIFEXITED(status)) {
+      fprintf(stderr,"Erreur de waitpid\n");
+      exit(EXIT_FAILURE);
+    }
+  }
+  return(EXIT_SUCCESS);
+}
+
diff --git a/_static/src/Threads/S8-src/fork-wait.c b/_static/src/Threads/S8-src/fork-wait.c
new file mode 100644
index 0000000000000000000000000000000000000000..9d8fa3b903351bc0344b3a42bfc385eadb836675
--- /dev/null
+++ b/_static/src/Threads/S8-src/fork-wait.c
@@ -0,0 +1,51 @@
+/**************************************
+ * fork-wait.c
+ *
+ * Programme d'exemple d'utilisation de
+ * fork
+ *
+ *************************************/
+///AAA
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/wait.h>
+#include <sys/types.h>
+
+
+int main (int argc, char *argv[])  {
+  int status;
+  pid_t pid;
+
+  pid=fork();
+
+  if (pid==-1) {
+    // erreur à l'exécution de fork
+    perror("fork");
+    exit(EXIT_FAILURE);
+  }
+  // pas d'erreur
+  if (pid==0) {
+    sleep(8);
+    return(42);
+  }
+  else {
+    // processus père
+    int fils=waitpid(pid,&status,0);
+    if(fils==-1) {
+      perror("wait");
+      exit(EXIT_FAILURE);
+    }
+    if(WIFEXITED(status)) {
+      printf("Le fils %d s'est terminé correctement et a retourné la valeur %d\n",fils,WEXITSTATUS(status));
+      return(EXIT_SUCCESS);
+    }
+    else {
+      if( WIFSIGNALED(status)) {
+	printf("Le fils %d a été tué par le signal %d\n",fils,WTERMSIG(status));
+      }
+      return(EXIT_FAILURE);
+    }
+  }
+}
+///BBB
diff --git a/_static/src/Threads/S8-src/fork-zombie.c b/_static/src/Threads/S8-src/fork-zombie.c
new file mode 100644
index 0000000000000000000000000000000000000000..33959bf53a1bbcd70d980bd9fae5164fe48115d9
--- /dev/null
+++ b/_static/src/Threads/S8-src/fork-zombie.c
@@ -0,0 +1,45 @@
+/**************************************
+ * fork-zombie.c
+ *
+ * Programme d'exemple d'utilisation de
+ * fork qui crée un zombie
+ *
+ *************************************/
+///AAA
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/wait.h>
+#include <sys/types.h>
+
+
+int main (int argc, char *argv[])  {
+  pid_t pid;
+  int err;
+
+  pid=fork();
+
+  if (pid==-1) {
+    // erreur à l'exécution de fork
+    perror("fork");
+    exit(EXIT_FAILURE);
+  }
+  // pas d'erreur
+  if (pid==0) {
+    // fin du fils
+    printf("pid du zombie: %d\n",getpid());
+    return(EXIT_SUCCESS);
+  }
+  else {
+    // processus père
+    sleep(50);
+    err=wait(NULL);
+    if(err!=0) {
+      perror("fork");
+      exit(EXIT_FAILURE);
+    }
+    printf("Fin du processus père [%d]\n",getpid());
+    return(EXIT_SUCCESS);
+  }
+}
+///BBB
diff --git a/_static/src/Threads/S8-src/fork.c b/_static/src/Threads/S8-src/fork.c
new file mode 100644
index 0000000000000000000000000000000000000000..6cd78db0a9484b656e6b9710fc6ca1363bbe5165
--- /dev/null
+++ b/_static/src/Threads/S8-src/fork.c
@@ -0,0 +1,49 @@
+/**************************************
+ * fork.c
+ *
+ * Programme d'exemple d'utilisation de
+ * fork
+ *
+ *************************************/
+///AAA
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+int g=0; // segment données
+
+int main (int argc, char *argv[])  {
+  int l=1252; // sur la pile
+  int *m;     // sur le heap
+  m=(int *) malloc(sizeof(int));
+  *m=-1;
+
+  pid_t pid;
+
+  pid=fork();
+
+  if (pid==-1) {
+    // erreur à l'exécution de fork
+    perror("fork");
+    exit(EXIT_FAILURE);
+  }
+  // pas d'erreur
+  if (pid==0) {
+    // processus fils
+    l++;
+    g++;
+    *m=17;
+    printf("Dans le processus fils g=%d, l=%d et *m=%d\n",g,l,*m);
+    free(m);
+    return(EXIT_SUCCESS);
+  }
+  else {
+    // processus père
+    sleep(2);
+    printf("Dans le processus père g=%d, l=%d et *m=%d\n",g,l,*m);
+    free(m);
+    // ...
+    return(EXIT_SUCCESS);
+  }
+}
+///BBB
diff --git a/_static/src/Threads/S8-src/fork.out b/_static/src/Threads/S8-src/fork.out
new file mode 100644
index 0000000000000000000000000000000000000000..1f71b8911b5f970a3e0012f03e3c4e800553bfbe
--- /dev/null
+++ b/_static/src/Threads/S8-src/fork.out
@@ -0,0 +1,2 @@
+Dans le processus fils g=1, l=1253 et *m=17
+Dans le processus père g=0, l=1252 et *m=-1
diff --git a/_static/src/Threads/S8-src/getpid.c b/_static/src/Threads/S8-src/getpid.c
new file mode 100644
index 0000000000000000000000000000000000000000..fddef731a947678c8a615b3bbfdddec52e9ea461
--- /dev/null
+++ b/_static/src/Threads/S8-src/getpid.c
@@ -0,0 +1,21 @@
+/**************************************
+ * getpid.c
+ *
+ * Programme d'exemple de getpid
+ *
+ **************************************/
+///AAA
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/types.h>
+
+
+int main (int argc, char *argv[])  {
+  int pid=getpid();
+  int ppid=getppid();
+  printf("Processus %d, parent:%d\n",pid,ppid);
+
+  return(EXIT_SUCCESS);
+}
+///BBB
diff --git a/_static/src/Threads/S8-src/imath.c b/_static/src/Threads/S8-src/imath.c
new file mode 100644
index 0000000000000000000000000000000000000000..3c2887a56e3763f57e5237fa94ab07081d4f2a3f
--- /dev/null
+++ b/_static/src/Threads/S8-src/imath.c
@@ -0,0 +1,20 @@
+/**************************************
+ * math.c
+ *
+ * Programme d'exemple d'utilisation de
+ * la librairie math
+ *
+ *************************************/
+///AAA
+#include <stdio.h>
+#include <stdlib.h>
+#include "imax.h"
+
+int main (int argc, char *argv[])  {
+  int n1=1;
+  int n2=-3;
+  printf("Maximum : %d\n",imax(n1,n2));
+
+  return(EXIT_SUCCESS);
+}
+///BBB
diff --git a/_static/src/Threads/S8-src/imax.c b/_static/src/Threads/S8-src/imax.c
new file mode 100644
index 0000000000000000000000000000000000000000..92b80fee674638cbf2c7ae9a52c0c1dbe7d5c4a7
--- /dev/null
+++ b/_static/src/Threads/S8-src/imax.c
@@ -0,0 +1,14 @@
+/**************************************
+ * imax.c
+ *
+ * Programme d'exemple d'utilisation de
+ * librairie
+ *
+ *************************************/
+///AAA
+
+int imax(int i, int j) {
+  return ((i>j) ? i : j);
+
+}
+///BBB
diff --git a/_static/src/Threads/S8-src/imax.h b/_static/src/Threads/S8-src/imax.h
new file mode 100644
index 0000000000000000000000000000000000000000..444fb1ab002477eecfb88e226b1a2ae23436d657
--- /dev/null
+++ b/_static/src/Threads/S8-src/imax.h
@@ -0,0 +1,12 @@
+/**************************************
+ * imax.h
+ *
+ * Programme d'exemple d'utilisation de
+ * librairie
+ *
+ *************************************/
+///AAA
+
+int imax(int,int);
+
+///BBB
diff --git a/_static/src/Threads/S8-src/math.c b/_static/src/Threads/S8-src/math.c
new file mode 100644
index 0000000000000000000000000000000000000000..55e23123df634f6f0c075ecc23521a711731f397
--- /dev/null
+++ b/_static/src/Threads/S8-src/math.c
@@ -0,0 +1,21 @@
+/**************************************
+ * math.c
+ *
+ * Programme d'exemple d'utilisation de
+ * la librairie math
+ *
+ *************************************/
+///AAA
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+
+
+int main (int argc, char *argv[])  {
+  double n1=1.0;
+  double n2=-3.14;
+  printf("Maximum : %f\n",fmax(n1,n2));
+
+  return(EXIT_SUCCESS);
+}
+///BBB
diff --git a/_static/src/Threads/S8-src/max.c b/_static/src/Threads/S8-src/max.c
new file mode 100644
index 0000000000000000000000000000000000000000..bab26965fb534d534034116f03af788642d01b79
--- /dev/null
+++ b/_static/src/Threads/S8-src/max.c
@@ -0,0 +1,20 @@
+/**************************************
+ * math.c
+ *
+ * Programme d'exemple d'utilisation de
+ * la librairie math
+ *
+ *************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+
+
+int main (int argc, char *argv[])  {
+  double n1=1.0;
+  double n2=-3.14;
+  printf("Maximum : %f\n",fmax(n1,n2));
+
+  return(EXIT_SUCCESS);
+}
diff --git a/_static/src/Threads/S8-src/mini8.c b/_static/src/Threads/S8-src/mini8.c
new file mode 100644
index 0000000000000000000000000000000000000000..b69b1aefa12db155a77c248310b4078af838fcd1
--- /dev/null
+++ b/_static/src/Threads/S8-src/mini8.c
@@ -0,0 +1,117 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include <pthread.h>
+#include <limits.h>
+#include <time.h>
+
+/* Necessary for the correct compilation */
+#define _POSIX_C_SOURCE 199309L
+
+#define N_ITERATIONS	(100)
+#define N_CONSUMERS	(4)
+#define N_PRODUCERS	(2)
+#define N_RETRIEVES	((N_ITERATIONS) * (N_PRODUCERS) / (N_CONSUMERS))
+#define MIN(a, b)	((a) > (b) ? (b) : (a))
+
+/* A COMPLETER */
+
+/*
+ * Insert val in the bounded-buffer. Should wait if there are no empty spaces
+ * available.
+ */
+void insert(int val)
+{
+	/* A COMPLETER */
+}
+
+/*
+ * Returns and removes the next element from the bounded buffer.
+ */
+int retrieve(void)
+{
+	/* A COMPLETER */
+	return -1;
+}
+
+
+void *producer(void *arg)
+{
+	int i, val;
+
+	for (i = 0; i < N_ITERATIONS; ++i) {
+		/* sleep for few miliseconds */
+		struct timespec sleep;
+		sleep.tv_sec = 0;
+		sleep.tv_nsec = (long) rand() % 100000000;
+		nanosleep(&sleep, NULL);
+
+		/* generate a value and insert it in the buffer */
+		val = abs(rand());
+		insert(val);
+	}
+	return NULL;
+}
+
+void *consumer(void *arg)
+{
+	int i, *min = (int *)arg;
+
+	for (i = 0; i < N_RETRIEVES; ++i) {
+		/* sleep for few miliseconds */
+		struct timespec sleep;
+		sleep.tv_sec = 0;
+		sleep.tv_nsec = (long) rand() % 100000000;
+		nanosleep(&sleep, NULL);
+
+		/* maintain the minimum value up to now */
+		*min = MIN(*min, retrieve());
+	}
+	return (void *)min;
+}
+
+int main (int argc, char const *argv[])
+{
+	int i, min = INT_MAX, *ret;
+	pthread_t producers[N_PRODUCERS];
+	pthread_t consumers[N_CONSUMERS];
+	int returns[N_CONSUMERS];
+	int err;
+
+	/* seed the PRNG */
+	srand(time(NULL));
+
+	/* A COMPLETER */
+
+	for (i = 0; i < N_PRODUCERS; ++i) {
+		err = pthread_create(&producers[i], NULL, producer, NULL);
+		if (err)
+			goto error;
+	}
+
+	for (i = 0; i < N_CONSUMERS; ++i) {
+		err = pthread_create(&consumers[i], NULL, consumer, &returns[i]);
+		if (err)
+			goto error;
+	}
+
+	for (i = 0; i < N_PRODUCERS; ++i) {
+		err = pthread_join(producers[i], NULL);
+		if (err)
+			goto error;
+	}
+
+	for (i = 0; i < N_CONSUMERS; ++i) {
+		err = pthread_join(consumers[i], (void **)&ret);
+		if (err)
+			goto error;
+		min = MIN(min, *ret);
+	}
+
+	printf("The minimal value generated is %d.\n", min);
+
+	return (EXIT_SUCCESS);
+
+error:
+	perror("Error happened:\n");
+	return (EXIT_FAILURE);
+}
diff --git a/_static/src/Threads/S8-src/pthread-perf.c b/_static/src/Threads/S8-src/pthread-perf.c
new file mode 100644
index 0000000000000000000000000000000000000000..07772a2c21ab37b146401686b55c6945b23ba375
--- /dev/null
+++ b/_static/src/Threads/S8-src/pthread-perf.c
@@ -0,0 +1,41 @@
+/**************************************
+ * pthread-perf.c
+ *
+ * Programme d'exemple pour calculer le coût
+ * de pthread
+ *
+ *************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <pthread.h>
+
+#define N 100000
+
+void *func(void * param) {
+  pthread_exit(NULL);
+}
+
+
+int main (int argc, char *argv[])  {
+  int err;
+  pthread_t thread;
+
+
+  for(int i=0;i<N;i++) {
+
+    err=pthread_create(&(thread),NULL,&func,NULL);
+    if(err!=0) {
+      perror("pthread_create");
+      exit(EXIT_FAILURE);
+    }
+    err=pthread_join(thread,NULL);
+    if(err!=0) {
+      perror("pthread_join");
+      exit(EXIT_FAILURE);
+    }
+  }
+  return(EXIT_SUCCESS);
+
+}
+
diff --git a/_static/src/Threads/S8-src/script.sh b/_static/src/Threads/S8-src/script.sh
new file mode 100755
index 0000000000000000000000000000000000000000..cfd6015e4989e6a37c97c0b8950c868f98b35761
--- /dev/null
+++ b/_static/src/Threads/S8-src/script.sh
@@ -0,0 +1,22 @@
+#!/bin/bash
+# script.sh
+if [ $# -ne 1 ]
+then
+    echo "Usage: `basename $0` fichier"
+    exit 1
+fi
+if [ -x ${1} ]
+then
+    head -1 $1 | grep "^#\!" >>/dev/null
+    if [ $? ]
+    then
+	echo "Script interprétable"
+	exit 0
+    else
+	echo "Script non-interprétable"
+	exit 1
+    fi
+else
+    echo "Bit x non mis dans les métadonnées"
+    exit 1
+fi
diff --git a/_static/src/Threads/S8-src/syscall.c b/_static/src/Threads/S8-src/syscall.c
new file mode 100644
index 0000000000000000000000000000000000000000..f102291addc712aefd597e9599441b81d9832c60
--- /dev/null
+++ b/_static/src/Threads/S8-src/syscall.c
@@ -0,0 +1,20 @@
+/**************************************
+ * syscall.c
+ *
+ * Programme d'exemple d'utilisation de syscall
+ *
+ **************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/syscall.h>
+
+
+int main (int argc, char *argv[])  {
+  int pid=getpid();
+  int pid2=syscall(SYS_getpgid);
+  printf("Processus %d, pid:%d\n",pid,pid2);
+
+  return(EXIT_SUCCESS);
+}
diff --git a/_static/src/Threads/S8-src/test.tail b/_static/src/Threads/S8-src/test.tail
new file mode 100755
index 0000000000000000000000000000000000000000..242953177ecd4d6f101fe13221388c466b0081bf
--- /dev/null
+++ b/_static/src/Threads/S8-src/test.tail
@@ -0,0 +1,3 @@
+#!/usr/bin/tail -n +1
+Hello, world
+SINF1252
diff --git a/index.rst b/index.rst
index caf2615a771ab429976850b6c9cd92e6b26bdcd5..99ad989a973d9f4a165186f6f45d017c09ee2046 100644
--- a/index.rst
+++ b/index.rst
@@ -51,7 +51,7 @@ Systèmes Multiprocesseurs
    Theorie/Threads/threads
    Theorie/Threads/threads2
    Theorie/Threads/coordination
-  .. Theorie/Threads/processus
+.. Theorie/Threads/processus
 
 Fichiers
 ********
@@ -60,7 +60,7 @@ Fichiers
    :maxdepth: 2
 
    Theorie/Fichiers/fichiers
-   Theorie/Fichiers/fichiers-signaux
+..   Theorie/Fichiers/fichiers-signaux
 
 
 ******
@@ -88,6 +88,7 @@ Annexes
 
 .. toctree::
    :maxdepth: 2
+
    bib
    glossaire