diff --git a/.gitkeep b/.gitkeep
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/Annexes/Makefile b/Annexes/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..0a8ac3d9e440478f60b924e1d23e98df0b34e1d4
--- /dev/null
+++ b/Annexes/Makefile
@@ -0,0 +1,161 @@
+# Makefile for Sphinx documentation
+#
+
+# You can set these variables from the command line.
+SPHINXOPTS    =
+SPHINXBUILD   = sphinx-build
+PAPER         = a4
+BUILDDIR      = ../web/notes/Outils
+
+# Internal variables.
+PAPEROPT_a4     = -D latex_paper_size=a4
+PAPEROPT_letter = -D latex_paper_size=letter
+ALLSPHINXOPTS   = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
+# the i18n builder cannot share the environment and doctrees with the others
+I18NSPHINXOPTS  = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
+
+.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext qcm projets sinf1252
+
+help:
+	@echo "Please use \`make <target>' where <target> is one of"
+	@echo "  html       to make standalone HTML files"
+	@echo "  dirhtml    to make HTML files named index.html in directories"
+	@echo "  singlehtml to make a single large HTML file"
+	@echo "  pickle     to make pickle files"
+	@echo "  json       to make JSON files"
+	@echo "  htmlhelp   to make HTML files and a HTML help project"
+	@echo "  qthelp     to make HTML files and a qthelp project"
+	@echo "  devhelp    to make HTML files and a Devhelp project"
+	@echo "  epub       to make an epub"
+	@echo "  latex      to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
+	@echo "  latexpdf   to make LaTeX files and run them through pdflatex"
+	@echo "  text       to make text files"
+	@echo "  man        to make manual pages"
+	@echo "  texinfo    to make Texinfo files"
+	@echo "  info       to make Texinfo files and run them through makeinfo"
+	@echo "  gettext    to make PO message catalogs"
+	@echo "  changes    to make an overview of all changed/added/deprecated items"
+	@echo "  linkcheck  to check all external links for integrity"
+	@echo "  doctest    to run all doctests embedded in the documentation (if enabled)"
+
+clean:
+	-rm -rf $(BUILDDIR)/*
+
+html:
+	$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
+	@echo
+	@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
+
+dirhtml:
+	$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
+	@echo
+	@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
+
+singlehtml:
+	$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
+	@echo
+	@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
+
+pickle:
+	$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
+	@echo
+	@echo "Build finished; now you can process the pickle files."
+
+json:
+	$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
+	@echo
+	@echo "Build finished; now you can process the JSON files."
+
+htmlhelp:
+	$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
+	@echo
+	@echo "Build finished; now you can run HTML Help Workshop with the" \
+	      ".hhp project file in $(BUILDDIR)/htmlhelp."
+
+qthelp:
+	$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
+	@echo
+	@echo "Build finished; now you can run "qcollectiongenerator" with the" \
+	      ".qhcp project file in $(BUILDDIR)/qthelp, like this:"
+	@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/SINF1252.qhcp"
+	@echo "To view the help file:"
+	@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/SINF1252.qhc"
+
+devhelp:
+	$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
+	@echo
+	@echo "Build finished."
+	@echo "To view the help file:"
+	@echo "# mkdir -p $$HOME/.local/share/devhelp/SINF1252"
+	@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/SINF1252"
+	@echo "# devhelp"
+
+epub:
+	$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
+	@echo
+	@echo "Build finished. The epub file is in $(BUILDDIR)/epub."
+
+latex:
+	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
+	@echo
+	@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
+	@echo "Run \`make' in that directory to run these through (pdf)latex" \
+	      "(use \`make latexpdf' here to do that automatically)."
+
+latexpdf:
+	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
+	@echo "Running LaTeX files through pdflatex..."
+	$(MAKE) -C $(BUILDDIR)/latex all-pdf
+	@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
+
+text:
+	$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
+	@echo
+	@echo "Build finished. The text files are in $(BUILDDIR)/text."
+
+man:
+	$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
+	@echo
+	@echo "Build finished. The manual pages are in $(BUILDDIR)/man."
+
+texinfo:
+	$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
+	@echo
+	@echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo."
+	@echo "Run \`make' in that directory to run these through makeinfo" \
+	      "(use \`make info' here to do that automatically)."
+
+info:
+	$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
+	@echo "Running Texinfo files through makeinfo..."
+	make -C $(BUILDDIR)/texinfo info
+	@echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."
+
+gettext:
+	$(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
+	@echo
+	@echo "Build finished. The message catalogs are in $(BUILDDIR)/locale."
+
+changes:
+	$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
+	@echo
+	@echo "The overview file is in $(BUILDDIR)/changes."
+
+linkcheck:
+	$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
+	@echo
+	@echo "Link check complete; look for any errors in the above output " \
+	      "or in $(BUILDDIR)/linkcheck/output.txt."
+
+doctest:
+	$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
+	@echo "Testing of doctests in the sources finished, look at the " \
+	      "results in $(BUILDDIR)/doctest/output.txt."
+
+qcm:
+	@for dir in Exercices/QCM/S*; do make -C $${dir}; done
+
+projets:
+	@for dir in Projets/P*; do [ -e $${dir}/Makefile ] && make -C $${dir}; true; done
+
+sinf1252: qcm projets html latexpdf epub
diff --git a/Annexes/README.md b/Annexes/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..3a3f83b0f69aef3c5351e41c89017ac0ffbcfe1d
--- /dev/null
+++ b/Annexes/README.md
@@ -0,0 +1 @@
+Ce répertoire est destiné à contenir des annexes relatives au projet P3 comme les documentes de prise en main du raspberry.
diff --git a/Annexes/_static b/Annexes/_static
new file mode 120000
index 0000000000000000000000000000000000000000..7a2b653646f86d98f976df94c66c017b5d24ecbe
--- /dev/null
+++ b/Annexes/_static
@@ -0,0 +1 @@
+../_static
\ No newline at end of file
diff --git a/Annexes/_templates b/Annexes/_templates
new file mode 120000
index 0000000000000000000000000000000000000000..db3df549a44959a192630b263daa927927264ea8
--- /dev/null
+++ b/Annexes/_templates
@@ -0,0 +1 @@
+../_templates
\ No newline at end of file
diff --git a/Annexes/conf.py b/Annexes/conf.py
new file mode 100644
index 0000000000000000000000000000000000000000..7a9e81ee239169140d54a09166c62e63a9c2e7ee
--- /dev/null
+++ b/Annexes/conf.py
@@ -0,0 +1,312 @@
+# -*- coding: utf-8 -*-
+#
+# SINF1252 documentation build configuration file, created by
+# sphinx-quickstart on Tue Jan  3 16:17:09 2012.
+#
+# This file is execfile()d with the current directory set to its containing dir.
+#
+# Note that not all possible configuration values are present in this
+# autogenerated file.
+#
+# All configuration values have a default; values that are commented out
+# serve to show the default.
+
+import sys, os
+
+# If extensions (or modules to document with autodoc) are in another directory,
+# add these directories to sys.path here. If the directory is relative to the
+# documentation root, use os.path.abspath to make it absolute, like shown here.
+#sys.path.insert(0, os.path.abspath('.'))
+
+# -- General configuration -----------------------------------------------------
+
+# If your documentation needs a minimal Sphinx version, state it here.
+#needs_sphinx = '1.0'
+
+# Add any Sphinx extension module names here, as strings. They can be extensions
+# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
+extensions = ['sphinx.ext.todo', 'sphinx.ext.ifconfig', 'sphinx.ext.mathjax', 'sphinx.ext.intersphinx' ]
+
+# ucomment
+#sys.path.append(os.path.abspath(os.getcwd()))
+#extensions.append('ucomment-extension')
+#html_translator_class = 'ucomment-extension.ucomment_html_translator'
+
+# Point to your Django application, which contains all
+# the other settings required.
+#ucomment = {}
+#ucomment['django_application_path'] = '/home/cpaasch/sinf1252/ucommentsite/ucommentapp'
+
+# Add any paths that contain templates here, relative to this directory.
+templates_path = ['_templates']
+
+# The suffix of source filenames.
+source_suffix = '.rst'
+
+# The encoding of source files.
+source_encoding = 'utf-8'
+#source_encoding = 'latin1'
+
+# The master toctree document.
+master_doc = 'index'
+
+# General information about the project.
+project = u'SINF1252 : Outils informatiques'
+copyright = u'2012-2014, O. Bonaventure, G. Detal, C. Paasch, B. Legat, N. Houtain, M. Demol'
+
+# The version info for the project you're documenting, acts as replacement for
+# |version| and |release|, also used in various other places throughout the
+# built documents.
+#
+# The short X.Y version.
+version = '2013'
+# The full version, including alpha/beta/rc tags.
+release = '2013'
+
+# The language for content autogenerated by Sphinx. Refer to documentation
+# for a list of supported languages.
+language = 'fr'
+
+# There are two options for replacing |today|: either, you set today to some
+# non-false value, then it is used:
+#today = ''
+# Else, today_fmt is used as the format for a strftime call.
+#today_fmt = '%B %d, %Y'
+
+# List of patterns, relative to source directory, that match files and
+# directories to ignore when looking for source files.
+exclude_patterns = ['_build', '.#*', '*/.#*', 'Exercices/QCM/*' ]
+
+# The reST default role (used for this markup: `text`) to use for all documents.
+#default_role = None
+
+# If true, '()' will be appended to :func: etc. cross-reference text.
+#add_function_parentheses = True
+
+# If true, the current module name will be prepended to all description
+# unit titles (such as .. function::).
+#add_module_names = True
+
+# If true, sectionauthor and moduleauthor directives will be shown in the
+# output. They are ignored by default.
+#show_authors = False
+
+# The name of the Pygments (syntax highlighting) style to use.
+pygments_style = 'sphinx'
+
+# A list of ignored prefixes for module index sorting.
+#modindex_common_prefix = []
+
+rst_epilog = """
+.. include:: /../Theorie/links.rst
+.. include:: /../Theorie/man_links.rst
+.. include:: /../Theorie/incl_links.rst
+"""
+# Intersphinx
+intersphinx_mapping = {'theorie': ('https://sites.uclouvain.be/SystInfo/notes/Theorie/html/', None), 'outils': ('https://sites.uclouvain.be/SystInfo/notes/Outils/html/', None), 'exercices': ('https://sites.uclouvain.be/SystInfo/notes/Exercices/html/', None)}
+
+
+
+# -- Options for HTML output ---------------------------------------------------
+
+# The theme to use for HTML and HTML Help pages.  See the documentation for
+# a list of builtin themes.
+html_theme = 'haiku'
+
+# Theme options are theme-specific and customize the look and feel of a theme
+# further.  For a list of options available for each theme, see the
+# documentation.
+#html_theme_options = {}
+
+# Add any paths that contain custom themes here, relative to this directory.
+#html_theme_path = []
+
+# The name for this set of Sphinx documents.  If None, it defaults to
+# "<project> v<release> documentation".
+html_title = u'Systèmes informatiques'
+
+# A shorter title for the navigation bar.  Default is the same as html_title.
+#html_short_title = None
+
+# The name of an image file (relative to this directory) to place at the top
+# of the sidebar.
+#html_logo = None
+
+# The name of an image file (within the static path) to use as favicon of the
+# docs.  This file should be a Windows icon file (.ico) being 16x16 or 32x32
+# pixels large.
+#html_favicon = None
+
+# Add any paths that contain custom static files (such as style sheets) here,
+# relative to this directory. They are copied after the builtin static files,
+# so a file named "default.css" will overwrite the builtin "default.css".
+html_static_path = ['_static']
+
+# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
+# using the given strftime format.
+#html_last_updated_fmt = '%b %d, %Y'
+
+# If true, SmartyPants will be used to convert quotes and dashes to
+# typographically correct entities.
+#html_use_smartypants = True
+
+# Custom sidebar templates, maps document names to template names.
+#html_sidebars = {}
+
+# Additional templates that should be rendered to pages, maps page names to
+# template names.
+#html_additional_pages = {}
+
+# If false, no module index is generated.
+#html_domain_indices = True
+
+# If false, no index is generated.
+#html_use_index = True
+
+# If true, the index is split into individual pages for each letter.
+#html_split_index = False
+
+# If true, links to the reST sources are added to the pages.
+#html_show_sourcelink = True
+
+# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
+#html_show_sphinx = True
+
+# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
+#html_show_copyright = True
+
+# If true, an OpenSearch description file will be output, and all pages will
+# contain a <link> tag referring to it.  The value of this option must be the
+# base URL from which the finished HTML is served.
+#html_use_opensearch = ''
+
+# This is the file name suffix for HTML files (e.g. ".xhtml").
+#html_file_suffix = None
+
+# Output file base name for HTML help builder.
+htmlhelp_basename = 'SINF1252doc'
+
+
+# -- Options for LaTeX output --------------------------------------------------
+
+latex_elements = {
+# The paper size ('letterpaper' or 'a4paper').
+'papersize': 'a4paper',
+
+# The font size ('10pt', '11pt' or '12pt').
+'pointsize': '10pt',
+
+# Additional stuff for the LaTeX preamble.
+#'preamble': '',
+}
+
+# Grouping the document tree into LaTeX files. List of tuples
+# (source start file, target name, title, author, documentclass [howto/manual]).
+latex_documents = [
+  ('index', 'SINF1252.tex', u'SINF1252',
+   u'O. Bonaventure, G. Detal, C. Paasch', 'manual'),
+]
+
+# The name of an image file (relative to this directory) to place at the top of
+# the title page.
+#latex_logo = None
+
+# For "manual" documents, if this is true, then toplevel headings are parts,
+# not chapters.
+#latex_use_parts = False
+
+# If true, show page references after internal links.
+#latex_show_pagerefs = False
+
+# If true, show URL addresses after external links.
+#latex_show_urls = False
+
+# Documents to append as an appendix to all manuals.
+#latex_appendices = []
+
+# If false, no module index is generated.
+#latex_domain_indices = True
+
+
+# -- Options for manual page output --------------------------------------------
+
+# One entry per manual page. List of tuples
+# (source start file, name, description, authors, manual section).
+man_pages = [
+    ('index', 'sinf1252', u'SINF1252',
+     [u'O. Bonaventure, G. Detal, C. Paasch'], 1)
+]
+
+# If true, show URL addresses after external links.
+#man_show_urls = False
+
+
+# -- Options for Texinfo output ------------------------------------------------
+
+# Grouping the document tree into Texinfo files. List of tuples
+# (source start file, target name, title, author,
+#  dir menu entry, description, category)
+texinfo_documents = [
+  ('index', 'SINF1252', u'SINF1252',
+   u'O. Bonaventure, G. Detal, C. Paasch', 'SINF1252', 'One line description of project.',
+   'Miscellaneous'),
+]
+
+# Documents to append as an appendix to all manuals.
+#texinfo_appendices = []
+
+# If false, no module index is generated.
+#texinfo_domain_indices = True
+
+# How to display URL addresses: 'footnote', 'no', or 'inline'.
+#texinfo_show_urls = 'footnote'
+
+
+# -- Options for Epub output ---------------------------------------------------
+
+# Bibliographic Dublin Core info.
+epub_title = u'SINF1252'
+epub_author = u'O. Bonaventure, G. Detal, C. Paasch'
+epub_publisher = u'O. Bonaventure, G. Detal, C. Paasch'
+epub_copyright = u'2013, O. Bonaventure, G. Detal, C. Paasch'
+
+# The language of the text. It defaults to the language option
+# or en if the language is not set.
+#epub_language = ''
+
+# The scheme of the identifier. Typical schemes are ISBN or URL.
+#epub_scheme = ''
+
+# The unique identifier of the text. This can be a ISBN number
+# or the project homepage.
+#epub_identifier = ''
+
+# A unique identification for the text.
+#epub_uid = ''
+
+# A tuple containing the cover image and cover page html template filenames.
+#epub_cover = ()
+
+# HTML files that should be inserted before the pages created by sphinx.
+# The format is a list of tuples containing the path and title.
+#epub_pre_files = []
+
+# HTML files shat should be inserted after the pages created by sphinx.
+# The format is a list of tuples containing the path and title.
+#epub_post_files = []
+
+# A list of files that should not be packed into the epub file.
+#epub_exclude_files = []
+
+# The depth of the table of contents in toc.ncx.
+#epub_tocdepth = 3
+
+# Allow duplicate toc entries.
+#epub_tocdup = True
+
+#try:
+#	open('.staff','r')
+#	tags.add('staff')
+#	print "Build as staff member"
+#except:
+#	print "Build as student"
diff --git a/Annexes/index.rst b/Annexes/index.rst
new file mode 100644
index 0000000000000000000000000000000000000000..02e473a863f36fa553e9578a19512aea9aad8876
--- /dev/null
+++ b/Annexes/index.rst
@@ -0,0 +1,25 @@
+.. -*- coding: utf-8 -*-
+.. Copyright |copy| 2012-2014 by `Olivier Bonaventure <http://inl.info.ucl.ac.be/obo>`_, Christoph Paasch, Grégory Detal et les étudiants du cours
+.. Ce fichier est distribué sous une licence `creative commons <http://creativecommons.org/licenses/by-sa/3.0/>`_
+
+
+###############################
+Systèmes informatiques : Outils
+###############################
+
+
+.. only:: html
+
+    Ce site web contient l'annexe relative au raspberry pi pour le cours `LEPL1503 <http://www.uclouvain.be/cours-2015-LSINF1252.html>`_ donné aux `étudiants en informatique <http://www.uclouvain.be/info.html>`_ à l'`Université catholique de Louvain <http://www.uclouvain.be>`_ (UCL). Les étudiants sont invités à ajouter leur commentaires en soumettant des patches via https://github.com/obonaventure/SystemesInformatiques 
+
+.. La version HTML est la préférable car elle contient des liens hypertextes vers les pages de manuel Linux qui font partie de la matière. D'autres formats sont possibles pour ceux qui veulent lire le document hors ligne :
+
+..        - :download:`distrib/SINF1252.epub` en format epub lisible sur tablettes style iPad ou Galaxy Tab
+..        - :download:`distrib/SINF1252.pdf` en format pdf pour lecture via les logiciels Adobe ou pour impression
+
+
+.. toctree::
+   :maxdepth: 2
+
+   prise-en-main-rasp
+
diff --git a/Annexes/prise-en-main-rasp.rst b/Annexes/prise-en-main-rasp.rst
new file mode 100644
index 0000000000000000000000000000000000000000..8b43285c21f896d5af5874fe8acd4918133499a3
--- /dev/null
+++ b/Annexes/prise-en-main-rasp.rst
@@ -0,0 +1,39 @@
+.. -*- coding: utf-8 -*-
+.. Copyright |copy| 2019 by Charles-Henry Bertrand Van Ouytsel and Sébastien Strebelle.
+.. Ce fichier est distribué sous une licence `creative commons <http://creativecommons.org/licenses/by-sa/3.0/>`_
+
+
+Flashage du raspberry pi
+========================
+
+
+
+Se connecter à son raspberry
+============================
+
+Dans cette section, nous allons voir une manière de vous connecter à votre raspberry pour exécuter des commandes sur celui-ci. Nus utiliserons ici le partage de connexion ethernet. D'autres méthodes existent pour se connecter mais ne seront pas couvertes dans cette annexe. Vous restez libres de vous renseigner par vous-même sur ces autres méthodes mais les assitants du cours ne pourrons alors pas vous aider si vous rencontrez un soucis de connexion. Il est nécessaire que SSH soit activé au préalable sur le raspberry.
+
+
+Windows
+-------
+
+Pré-requis : Vous aurez besoin du logiciel Putty (https://www.putty.org/)
+
+1. Accédez au menu "Paramètres réseau et internet"
+2. Sélectionnez "Modifier les options d'adaptateur"
+3. Faites un clic droit sur Wifi et sélectionnez "Propriétés"
+4. Dans l'onglet "Partage", Cochez la case "Autoriser d'autres utilisateurs du réseau à se connecter via la connexion internet de cet ordinateur"
+5. Faites maintenant un clic droit sur l'Ethernet (adaptateur LAN) et sélectionnez à nouveau "Propriétés"
+6. Double cliquez sur l'option IPV4 et notez l'IP dynamique affichée.
+7. Connectez votre raspberry à votre ordinateur via le câble Ethernet de votre boite.
+8. Ouvrez Putty, entrez l'addresse IP trouvée précédemment puis appuyez sur "Open"
+9. Dans l'invite de commande, indiquez comme nom d'utilisateur "pi" et comme mot de passe "raspberry"
+10. Vous voilà connecté à votre raspberry !
+
+Linux
+-----
+
+
+
+Mac OS
+------
diff --git a/Makefile b/Makefile
index 30456d1a30ae668078d370a827b3731c4872c4cd..8956f97dd76f42cc4d8986add5489e87d26cc5de 100644
--- a/Makefile
+++ b/Makefile
@@ -14,7 +14,7 @@ ALLSPHINXOPTS   = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
 # the i18n builder cannot share the environment and doctrees with the others
 I18NSPHINXOPTS  = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
 
-.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext qcm projets sinf1252
+.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext qcm projets lepl1503
 
 help:
 	@echo "Please use \`make <target>' where <target> is one of"
@@ -158,4 +158,4 @@ qcm:
 projets:
 	@for dir in Projets/P*; do [ -e $${dir}/Makefile ] && make -C $${dir}; true; done
 
-sinf1252: qcm projets html latexpdf epub
+lepl1503: qcm projets html latexpdf epub
diff --git a/Outils/git.rst b/Outils/git.rst
index 43ae7eac4a41756e81336553c61e755c73655568..1ed46aca1af0f075b8bff951cdffec895a5b0ba2 100644
--- a/Outils/git.rst
+++ b/Outils/git.rst
@@ -2318,21 +2318,18 @@ compilations, le même résultat qu’avant :
 À nouveau, n’oubliez pas d’utiliser ``git bisect reset`` avant de continuer à
 travailler sur le dépôt.
 
-Subversion
-----------
-
-`subversion`_ (ou abrégé `svn(1)`_) est un logiciel qui permet à plusieurs utilisateurs de travailler sur les mêmes documents de type texte. `Subversion`_ est fréquemment utilisé pour gérer du code source développé de façon collaborative, mais il peut aussi servir à gérer n'importe quel ensemble de fichiers (de préférence textes) manipulés par plusieurs personnes.
+.. `subversion`_ (ou abrégé `svn(1)`_) est un logiciel qui permet à plusieurs utilisateurs de travailler sur les mêmes documents de type texte. `Subversion`_ est fréquemment utilisé pour gérer du code source développé de façon collaborative, mais il peut aussi servir à gérer n'importe quel ensemble de fichiers (de préférence textes) manipulés par plusieurs personnes.
 
 .. Dans le cadre du cours SINF1252 vous devez vous inscrire à subversion dans le projet ``SINF1252_2012`` en suivant le lien et les instructions sur http://wiki.student.info.ucl.ac.be/index.php/Svn
 
-Pour commencer l'utilisation de `svn(1)`_ vous devriez faire d'abord un ``checkout`` du répertoire:
+.. Pour commencer l'utilisation de `svn(1)`_ vous devriez faire d'abord un ``checkout`` du répertoire:
 
         .. code-block:: console
 
                 $ svn checkout <url de votre répertoire>
                 Checked out revision 1.
 
-Ceci installe votre répertoire (ici, nommé ``my_rep``) dans le dossier courant. Vous pouvez vous déplacer dans le nouveau dossier et créer un nouveau dossier pour cet premier projet. Il faut explicitement ajouter ce dossier à svn avec la commande ``svn add [nom du dossier]``. Chaque fichier et dossier dont vous voulez qu'il fasse partie du contrôle de version doivent être ajoutés avec cette commande.
+.. Ceci installe votre répertoire (ici, nommé ``my_rep``) dans le dossier courant. Vous pouvez vous déplacer dans le nouveau dossier et créer un nouveau dossier pour cet premier projet. Il faut explicitement ajouter ce dossier à svn avec la commande ``svn add [nom du dossier]``. Chaque fichier et dossier dont vous voulez qu'il fasse partie du contrôle de version doivent être ajoutés avec cette commande.
 
         .. code-block:: console
 
@@ -2341,7 +2338,7 @@ Ceci installe votre répertoire (ici, nommé ``my_rep``) dans le dossier courant
                 $ svn add projet_S1
                 A       projet_S1
 
-Ce dossier n'a pas encore été envoyé sur le serveur principal et n'est donc pas encore visible pour d'autres utilisateurs. Pour afficher l'état de votre répertoire utilisez ``svn status``. La lettre ``A`` indique que ceci est un nouveau dossier/fichier pas encore envoyé vers le serveur. ``?`` indique que les fichiers/dossiers ne font pas partie du répertoire svn (on peut les ajouter avec ``svn add``). ``M`` indique que les fichiers sont modifiés localement mais pas encore envoyés vers le serveur. Ces fichiers font partie du répertoire svn.
+.. Ce dossier n'a pas encore été envoyé sur le serveur principal et n'est donc pas encore visible pour d'autres utilisateurs. Pour afficher l'état de votre répertoire utilisez ``svn status``. La lettre ``A`` indique que ceci est un nouveau dossier/fichier pas encore envoyé vers le serveur. ``?`` indique que les fichiers/dossiers ne font pas partie du répertoire svn (on peut les ajouter avec ``svn add``). ``M`` indique que les fichiers sont modifiés localement mais pas encore envoyés vers le serveur. Ces fichiers font partie du répertoire svn.
 
         .. code-block:: console
 
@@ -2352,10 +2349,10 @@ Ce dossier n'a pas encore été envoyé sur le serveur principal et n'est donc p
                 Transmitting file data .
                 Committed revision 2.
 
-La commande ``svn commit`` permet de pousser les changements locaux et les nouveaux fichiers vers le serveur. La chaîne de charactères entre les ``"`` est le commentaire qu'il faut ajouter au commit. Il est important de commenter vos commits pour que vous puissiez vous retrouvez dans votre historique. L'historique de votre répertoire peut être affiché avec la commande ``svn log``.
+.. La commande ``svn commit`` permet de pousser les changements locaux et les nouveaux fichiers vers le serveur. La chaîne de charactères entre les ``"`` est le commentaire qu'il faut ajouter au commit. Il est important de commenter vos commits pour que vous puissiez vous retrouvez dans votre historique. L'historique de votre répertoire peut être affiché avec la commande ``svn log``.
 
-Les autres utilisateurs de votre répertoire (c'est-à-dire dans le cadre de ce cours: vôtre binôme du groupe) peuvent à partir de maintenant accéder à ce nouveau dossier en mettant à jour son répertoire local.
-Pour mettre à jour le répertoire local, on utilise la commande ``svn update``.
+.. Les autres utilisateurs de votre répertoire (c'est-à-dire dans le cadre de ce cours: vôtre binôme du groupe) peuvent à partir de maintenant accéder à ce nouveau dossier en mettant à jour son répertoire local.
+.. Pour mettre à jour le répertoire local, on utilise la commande ``svn update``.
 
         .. code-block:: console
 
@@ -2364,6 +2361,6 @@ Pour mettre à jour le répertoire local, on utilise la commande ``svn update``.
                 A       projet_S1
                 Updated to revision 2.
 
-Il est recommandé de toujours faire un ``update`` avant de faire un ``commit``. Lors d'un update il est possible qu'un conflit se crée dans votre dossier local. Ceci peut arriver si vous avez modifié une ligne dans un fichier localement et que cette ligne a aussi été modifiée par le commit d'un autre utilisateur. Pour résoudre le conflit, vous devez éditer le fichier que svn a indiqué être en conflit en cherchant des lignes qui commencent par ``<<<``. Corrigez ce fichier et retournez dans la console et tapez ``r`` pour indiquer à svn que ce conflit a été résolu.
+.. Il est recommandé de toujours faire un ``update`` avant de faire un ``commit``. Lors d'un update il est possible qu'un conflit se crée dans votre dossier local. Ceci peut arriver si vous avez modifié une ligne dans un fichier localement et que cette ligne a aussi été modifiée par le commit d'un autre utilisateur. Pour résoudre le conflit, vous devez éditer le fichier que svn a indiqué être en conflit en cherchant des lignes qui commencent par ``<<<``. Corrigez ce fichier et retournez dans la console et tapez ``r`` pour indiquer à svn que ce conflit a été résolu.
 
-Pour plus d'informations sur svn regardez les commandes ``svn help``, ``svn help [commande]`` ou http://svnbook.red-bean.com/. Une recherche sur Google vous aidera aussi pour résoudre vos problèmes avec subversion.
+.. Pour plus d'informations sur svn regardez les commandes ``svn help``, ``svn help [commande]`` ou http://svnbook.red-bean.com/. Une recherche sur Google vous aidera aussi pour résoudre vos problèmes avec subversion.".."
diff --git a/Theorie/C/datatypes.rst b/Theorie/C/datatypes.rst
index ceb4e4d0f3a72fc116a79c862455cd40c9605bc6..4015b0a362660635894206deaacf46468c7f5157 100644
--- a/Theorie/C/datatypes.rst
+++ b/Theorie/C/datatypes.rst
@@ -281,7 +281,7 @@ est décomposée en trois parties [#fexemple]_ :
  - `e` bits sont réservés pour stocker l'exposant [#fexposant]_.
  - Les `f` bits de poids faible servent à stocker la partie fractionnaire du nombre réel.
 
-.. figure:: /C/svg/Float_example.png
+.. figure:: /_static/figures/C/svg/Float_example.png
    :align: center
    :scale: 100
 
diff --git a/Theorie/C/intro-C.rst b/Theorie/C/intro-C.rst
index 566d3e500b2bb2fc32d4886fafef0d7251ea8125..15b09c24601dc0bec0d88e8b4cba14371b58b91a 100644
--- a/Theorie/C/intro-C.rst
+++ b/Theorie/C/intro-C.rst
@@ -57,7 +57,7 @@ Ensuite, un programme écrit en langage C comprend principalement des expression
         .. code-block:: c
 
            #define ZERO  0
-	   #define STRING "SINF1252"
+	   #define STRING "LEPL1503"
 
  - importer (directive ``#include``) un fichier. Ce fichier contient généralement des prototypes de fonctions et des constantes. En langage C, ces fichiers qui sont inclus dans un programme sont appelés des `header files` et ont par convention un nom se terminant par ``.h``. Le programme :download:`src/hello.c` ci-dessus importe deux fichiers `headers` standards :
 
diff --git a/Theorie/C/linker.rst b/Theorie/C/linker.rst
index 41112ec1386d5e7043aaf317d8633406edcb8ded..03a2495e536ea61d50a91a1e5c91d4aed9d5db34 100644
--- a/Theorie/C/linker.rst
+++ b/Theorie/C/linker.rst
@@ -154,7 +154,7 @@ La compilation d'un tel programme se déroule en plusieurs étapes. La première
 
 La figure ci-dessous représente graphiquement les différentes étapes de compilation des modules ``min.c`` et ``main.c``.
 
-.. figure:: /C/figures/figures-007-c.png
+.. figure:: /_static/figures/C/figures/figures-007-c.png
    :align: center
    :scale: 60
 
diff --git a/Theorie/C/malloc.rst b/Theorie/C/malloc.rst
index 4a3e263161ff3e78b4a96d8463fc6a99a014340b..674f418d13068fd9b06d222db94fec87d25d83cf 100644
--- a/Theorie/C/malloc.rst
+++ b/Theorie/C/malloc.rst
@@ -131,11 +131,12 @@ Organisation de la mémoire
 
 Lors de l'exécution d'un programme en mémoire, le système d'exploitation charge depuis le système de fichier le programme en langage machine et le place à un endroit convenu en mémoire. Lorsqu'un programme s'exécute sur un système Unix, la mémoire peut être vue comme étant divisée en six zones principales. Ces zones sont représentées schématiquement dans la figure ci-dessous.
 
-.. figure:: /C/figures/figures-001-c.png
+.. figure:: /_static/figures/C/figures/figures-001-c.png
    :align: center
 
    Organisation d'un programme Linux en mémoire
 
+
 La figure ci-dessus présente une vision schématique de la façon dont un processus Linux est organisé en mémoire centrale. Il y a d'abord une partie de la mémoire qui est réservée au système d'exploitation (OS dans la figure). Cette zone est représentée en grisé dans la figure.
 
 Le segment text
diff --git a/Theorie/C/src/cmdline.out b/Theorie/C/src/cmdline.out
index 90ce18288d15f0de91ab646132fd7b5b5da9c186..a730fe9056a2951317464e3ea6da879f5cb1ee94 100644
--- a/Theorie/C/src/cmdline.out
+++ b/Theorie/C/src/cmdline.out
@@ -3,4 +3,4 @@ argument[0] : ./cmdline
 argument[1] : 1
 argument[2] : -list
 argument[3] : abcdef
-argument[4] : sinf1252
+argument[4] : lepl1503
diff --git a/Theorie/C/src/printf.out b/Theorie/C/src/printf.out
index 52d6f66f96fec16dcee9f506fd22d0dfbc4dfa1f..437d3ce012156d21e130bce20f133026c7d0a59f 100644
--- a/Theorie/C/src/printf.out
+++ b/Theorie/C/src/printf.out
@@ -1,10 +1,10 @@
 Monday, April 1, 12:42
 PI = 3.141593
-S
-I
-N
-F
+L
+E
+P
+L
 1
-2
 5
-2
+0
+3
diff --git a/Theorie/Fichiers/fichiers-signaux.rst b/Theorie/Fichiers/fichiers-signaux.rst
index 1dc29d8a3bacc6710baff4b40e12da7589ac87e2..6992da64bcd76f9441d37d23677524ad5dbb3bd5 100644
--- a/Theorie/Fichiers/fichiers-signaux.rst
+++ b/Theorie/Fichiers/fichiers-signaux.rst
@@ -415,7 +415,7 @@ A titre d'exemple, considérons l'exécution de la commande suivante depuis le s
 
 Lors de son exécution, deux open file objects sont créés dans le noyau. Le premier est relatif au fichier ``/tmp/t`` qui est associé au descripteur ``stdin``. Le second est lié au fichier ``/tmp/out`` et est associé au descripteur ``stdout``. Ces open-file objects sont représentés graphiquement dans la figure ci-dessous.
 
-.. figure:: /Fichiers/fig/figures-10-001-c.png
+.. figure:: /_static/figures/Fichiers/fig/figures-10-001-c.png
    :align: center
    :scale: 60
 
@@ -429,7 +429,7 @@ Les open file objects sont également utilisés lorsque plusieurs processus ouvr
 
 Lors de l'exécution de ces deux processus, le noyau va attribuer un descripteur de fichier à chacun d'eux. Si ``file`` est le premier fichier ouvert par chaque processus, il sera associé au descripteur ``3``. Le noyau créera un open-file object pour le fichier ``file`` utilisé par le processus ``prog1`` et un autre open-file object pour le fichier ``file`` utilisé par le processus ``prog2``. Ces deux open-file objects référencient le même inode et donc le même fichier, mais ils peuvent avoir des modes et des offset pointers qui sont totalement indépendants. Tous les accès faits par le processus ``prog2`` sont complètement indépendants des accès faits par le processus ``prog1``. Cette utilisation d'un même fichier par deux processus distincts est représentée graphiquement dans la figure ci-dessous.
 
-.. figure:: /Fichiers/fig/figures-10-002-c.png
+.. figure:: /_static/figures/Fichiers/fig/figures-10-002-c.png
    :align: center
    :scale: 60
 
@@ -437,7 +437,7 @@ Lors de l'exécution de ces deux processus, le noyau va attribuer un descripteur
 Sous Unix et Linux, il est important d'analyser également ce qu'il se passe lors de la création d'un processus en utilisant l'appel système `fork(2)`_. Imaginons que le processus ``prog1`` discuté ci-dessous effectue `fork(2)`_ après avoir ouvert le fichier ``file``. Dans ce cas, le noyau du système d'exploitation va dupliquer la table des descripteurs de fichiers du processus père pour créer celle du processus fils. Le processus père et le processus fils ont donc chacun une table des descripteurs de fichiers qui leur est propre. Cela permet, comme nous l'avons vu lorsque nous avons présenté les pipes, que le fils ferme un de ses descripteurs de fichiers sans que cela n'ait d'impact sur l'utilisation de ce descripteur de fichier par le processus père. Par contre, l'exécution de l'appel système `fork(2)`_ ne copie pas les open-file objects. Après exécution de `fork(2)`_ le descripteur de fichiers ``3`` dans le processus père pointe vers l'open-file object associé au fichier ``file`` et le même descripteur dans le processus fils pointe vers le même open-file object. Cette situation est représentée schématiquement dans la figure ci-dessous.
 
 
-.. figure:: /Fichiers/fig/figures-10-003-c.png
+.. figure:: /_static/figures/Fichiers/fig/figures-10-003-c.png
    :align: center
    :scale: 80
 
@@ -516,7 +516,7 @@ Le premier argument est le descripteur de fichiers sur lequel le lock doit être
 
 Cette structure permet de spécifier plus finement qu'avec la fonction `lockf(3)`_ la section du fichier sur laquelle le lock doit être placé. L'utilisation de locks force le noyau à maintenir des structures de données supplémentaires pour stocker ces locks et les processus qui peuvent être en attente sur chacun de ces locks. Conceptuellement, cette structure de données est associée à chaque fichier comme représenté dans la figure ci-dessous.
 
-.. figure:: /Fichiers/fig/figures-10-004-c.png
+.. figure:: /_static/figures/Fichiers/fig/figures-10-004-c.png
    :align: center
    :scale: 80
 
diff --git a/Theorie/Fichiers/fichiers.rst b/Theorie/Fichiers/fichiers.rst
index 1544bec2c7a201f31465a1836aae94d3fc680f2e..fcdbda058888302cdd1695efff6494d0909bde5e 100644
--- a/Theorie/Fichiers/fichiers.rst
+++ b/Theorie/Fichiers/fichiers.rst
@@ -179,97 +179,100 @@ Il existe plusieurs appels systèmes et fonctions de la librairie standard qui p
 
 Les fonctions de manipulation des répertoires méritent que l'on s'y attarde un peu. Un répertoire est un fichier qui a une structure spéciale. Ces trois fonctions permettent d'en extraire de l'information en respectant le format d'un répertoire. Pour accéder à un répertoire, il faut d'abord l'ouvrir en utilisant `opendir(3)`_. La fonction `readdir(3)`_ permet d'accéder aux différentes entrées de ce répertoire et `closedir(3)`_ doit être utilisée lorsque l'accès n'est plus nécessaire. La fonction `readdir(3)`_ permet de manipuler la structure ``dirent`` qui est définie dans `bits/dirent.h`_.
 
-.. code-block:: c
+	.. code-block:: c
 
-          struct dirent {
-               ino_t          d_ino;       /* inode number */
-               off_t          d_off;       /* offset to the next dirent */
-               unsigned short d_reclen;    /* length of this record */
-               unsigned char  d_type;      /* type of file; not supported
-                                              by all file system types */
-               char           d_name[256]; /* filename */
-           };
+		  struct dirent {
+		       ino_t          d_ino;       /* inode number */
+		       off_t          d_off;       /* offset to the next dirent */
+		       unsigned short d_reclen;    /* length of this record */
+		       unsigned char  d_type;      /* type of file; not supported
+		                                      by all file system types */
+		       char           d_name[256]; /* filename */
+		   };
 
            
-.. spelling::
+	.. spelling::
 
-   l'inode
-   métadonnée
-   
+	   l'inode
+	   métadonnée
+	   
 Cette structure comprend le numéro de l'inode, c'est-à-dire la métadonnée qui contient les informations relatives au fichier/répertoire, la position de l'entrée ``dirent`` qui suite, la longueur de l'entrée, son type et le nom de l'entrée dans le répertoire. Chaque appel à `readdir(3)`_ retourne un pointeur vers une structure de ce type.
 
 
 L'extrait de code ci-dessous permet de lister tous les fichiers présents dans le répertoire ``name``.
 
+
 .. literalinclude:: /Fichiers/src/readdir.c
    :encoding: utf-8
    :language: c
    :start-after: ///AAA
    :end-before: ///BBB
 
+		
+		
 La lecture d'un répertoire avec `readdir(3)`_ commence au début de ce répertoire. A chaque appel à `readdir(3)`_, le programme appelant récupère un pointeur vers une zone mémoire contenant une structure ``dirent`` avec l'entrée suivante du répertoire ou ``NULL`` lorsque la fin du répertoire est atteinte. Si une fonction doit relire à nouveau un répertoire, cela peut se faire en utilisant `seekdir(3)`_ ou `rewinddir(3)`_.
 
 
 .. note:: `readdir(3)`_ et les threads
 
-  La fonction `readdir(3)`_ est un exemple de fonction non-réentrante qu'il faut éviter d'utiliser dans une application dont plusieurs threads doivent pouvoir parcourir le même répertoire. Ce problème est causé par l'utilisation d'une zone de mémoire ``static`` afin de stocker la structure dont le pointeur est retourné par `readdir(3)`_. Dans une application utilisant plusieurs threads, il faut utiliser la fonction `readdir_r(3)`_ :
+   La fonction `readdir(3)`_ est un exemple de fonction non-réentrante qu'il faut éviter d'utiliser dans une application dont plusieurs threads doivent pouvoir parcourir le même répertoire. Ce problème est causé par l'utilisation d'une zone de mémoire ``static`` afin de stocker la structure dont le pointeur est retourné par `readdir(3)`_. Dans une application utilisant plusieurs threads, il faut utiliser la fonction `readdir_r(3)`_ :
 
-  .. code-block:: c
+	  .. code-block:: c
 
-     int  readdir_r(DIR *restrict dirp, struct dirent *restrict entry,
-                    struct dirent **restrict result);
+	     int  readdir_r(DIR *restrict dirp, struct dirent *restrict entry,
+		            struct dirent **restrict result);
 
 
-  Cette fonction prend comme arguments le pointeur ``entry`` vers un buffer propre à l'appelant qui permet de stocker le résultat de `readdir_r(3)`_.
+	  Cette fonction prend comme arguments le pointeur ``entry`` vers un buffer propre à l'appelant qui permet de stocker le résultat de `readdir_r(3)`_.
 
 
 Les appels systèmes `link(2)`_ et `unlink(2)`_ sont un peu particuliers et méritent une description plus détaillée. Sous Unix, un :term:`inode` est associé à chaque fichier mais l':term:`inode` ne contient pas le nom de fichier parmi les méta-données qu'il stocke. Par contre, chaque :term:`inode` contient un compteur (``nlinks``) du nombre de liens vers un fichier. Cela permet d'avoir une seule copie d'un fichier qui est accessible depuis plusieurs répertoires. Pour comprendre cette utilisation des liens sur un système de fichiers Unix, considérons le scénario suivant.
 
-.. code-block:: console
-
-   $ mkdir a
-   $ mkdir b
-   $ cd a
-   $ echo "test" > test.txt
-   $ cd ..
-   $ ln a/test.txt a/test2.txt
-   $ ls -li a
-   total 16
-   9624126 -rw-r--r--  2 obo  stafinfo  5 24 mar 21:14 test.txt
-   9624126 -rw-r--r--  2 obo  stafinfo  5 24 mar 21:14 test2.txt
-   $ ln a/test.txt b/test3.txt
-   $ stat --format "inode=%i nlinks=%h" b/test3.txt
-   inode=9624126 nlinks=3
-   $ ls -li b
-   total 8
-   9624126 -rw-r--r--  3 obo  stafinfo  5 24 mar 21:14 test3.txt
-   $ echo "complement" >> b/test3.txt
-   $ ls -li a
-   total 16
-   9624126 -rw-r--r--  3 obo  stafinfo  16 24 mar 21:15 test.txt
-   9624126 -rw-r--r--  3 obo  stafinfo  16 24 mar 21:15 test2.txt
-   $ ls -li b
-   total 8
-   9624126 -rw-r--r--  3 obo  stafinfo  16 24 mar 21:15 test3.txt
-   $ cat b/test3.txt
-   test
-   complement
-   $ cat a/test.txt
-   test
-   complement
-   $ rm a/test2.txt
-   $ ls -li a
-   total 8
-   9624126 -rw-r--r--  2 obo  stafinfo  16 24 mar 21:15 test.txt
-   $ rm a/test.txt
-   $ ls -li a
-   $ ls -li b
-   total 8
-   9624126 -rw-r--r--  1 obo  stafinfo  16 24 mar 21:15 test3.txt
-
-Dans ce scénario, deux répertoires sont créés avec la commande `mkdir(1)`_. Ensuite, la commande `echo(1)`_ est utilisée pour créer le fichier ``test.txt`` contenant la chaîne de caractères ``test`` dans le répertoire ``a``. Ce fichier est associé à l':term:`inode` ``9624126``. La commande `ln(1)`_ permet de rendre ce fichier accessible sous un autre nom depuis le même répertoire. La sortie produite par la commande `ls(1)`_ indique que ces deux fichiers qui sont présents dans le répertoire ``a`` ont tous les deux le même ``inode``. Ils correspondent donc aux mêmes données sur le disque. A ce moment, le compteur ``nlinks`` de l':term:`inode` ``9624126`` a la valeur ``2``. La commande `ln(1)`_ peut être utilisée pour créer un lien vers un fichier qui se trouve dans un autre répertoire [#flns]_ comme le montre la création du fichier ``test3.txt`` dans le répertoire ``b``. Ces trois fichiers correspondant au même :term:`inode`, toute modification à l'un des fichiers affecte et est visible dans n'importe lequel des liens vers ce fichier. C'est ce que l'on voit lorsque la commande ``echo "complement" >> b/test3.txt`` est exécutée. Cette commande affecte immédiatement les trois fichiers. La commande ``rm a/test2.txt`` efface la référence du fichier sous le nom ``a/test2.txt``, mais les deux autres liens restent accessibles. Le fichier ne sera réellement effacé qu'après que le dernier lien vers l':term:`inode` correspondant aie été supprimé. La commande `rm(1)`_ utilise en pratique l'appel système `unlink(2)`_ qui en toute généralité décrémente le compteur de liens de l'inode correspondant au fichier et l'efface lorsque ce compteur atteint la valeur ``0``.
-
-Une description détaillée du fonctionnement de ces appels systèmes et fonctions de la librairie standard peut se trouver dans les livres de référence sur la programmation en C sous Unix [Kerrisk2010]_, [Mitchell+2001]_, [StevensRago2008]_.
+	.. code-block:: console
+
+	   $ mkdir a
+	   $ mkdir b
+	   $ cd a
+	   $ echo "test" > test.txt
+	   $ cd ..
+	   $ ln a/test.txt a/test2.txt
+	   $ ls -li a
+	   total 16
+	   9624126 -rw-r--r--  2 obo  stafinfo  5 24 mar 21:14 test.txt
+	   9624126 -rw-r--r--  2 obo  stafinfo  5 24 mar 21:14 test2.txt
+	   $ ln a/test.txt b/test3.txt
+	   $ stat --format "inode=%i nlinks=%h" b/test3.txt
+	   inode=9624126 nlinks=3
+	   $ ls -li b
+	   total 8
+	   9624126 -rw-r--r--  3 obo  stafinfo  5 24 mar 21:14 test3.txt
+	   $ echo "complement" >> b/test3.txt
+	   $ ls -li a
+	   total 16
+	   9624126 -rw-r--r--  3 obo  stafinfo  16 24 mar 21:15 test.txt
+	   9624126 -rw-r--r--  3 obo  stafinfo  16 24 mar 21:15 test2.txt
+	   $ ls -li b
+	   total 8
+	   9624126 -rw-r--r--  3 obo  stafinfo  16 24 mar 21:15 test3.txt
+	   $ cat b/test3.txt
+	   test
+	   complement
+	   $ cat a/test.txt
+	   test
+	   complement
+	   $ rm a/test2.txt
+	   $ ls -li a
+	   total 8
+	   9624126 -rw-r--r--  2 obo  stafinfo  16 24 mar 21:15 test.txt
+	   $ rm a/test.txt
+	   $ ls -li a
+	   $ ls -li b
+	   total 8
+	   9624126 -rw-r--r--  1 obo  stafinfo  16 24 mar 21:15 test3.txt
+
+	Dans ce scénario, deux répertoires sont créés avec la commande `mkdir(1)`_. Ensuite, la commande `echo(1)`_ est utilisée pour créer le fichier ``test.txt`` contenant la chaîne de caractères ``test`` dans le répertoire ``a``. Ce fichier est associé à l':term:`inode` ``9624126``. La commande `ln(1)`_ permet de rendre ce fichier accessible sous un autre nom depuis le même répertoire. La sortie produite par la commande `ls(1)`_ indique que ces deux fichiers qui sont présents dans le répertoire ``a`` ont tous les deux le même ``inode``. Ils correspondent donc aux mêmes données sur le disque. A ce moment, le compteur ``nlinks`` de l':term:`inode` ``9624126`` a la valeur ``2``. La commande `ln(1)`_ peut être utilisée pour créer un lien vers un fichier qui se trouve dans un autre répertoire [#flns]_ comme le montre la création du fichier ``test3.txt`` dans le répertoire ``b``. Ces trois fichiers correspondant au même :term:`inode`, toute modification à l'un des fichiers affecte et est visible dans n'importe lequel des liens vers ce fichier. C'est ce que l'on voit lorsque la commande ``echo "complement" >> b/test3.txt`` est exécutée. Cette commande affecte immédiatement les trois fichiers. La commande ``rm a/test2.txt`` efface la référence du fichier sous le nom ``a/test2.txt``, mais les deux autres liens restent accessibles. Le fichier ne sera réellement effacé qu'après que le dernier lien vers l':term:`inode` correspondant aie été supprimé. La commande `rm(1)`_ utilise en pratique l'appel système `unlink(2)`_ qui en toute généralité décrémente le compteur de liens de l'inode correspondant au fichier et l'efface lorsque ce compteur atteint la valeur ``0``.
+
+	Une description détaillée du fonctionnement de ces appels systèmes et fonctions de la librairie standard peut se trouver dans les livres de référence sur la programmation en C sous Unix [Kerrisk2010]_, [Mitchell+2001]_, [StevensRago2008]_.
 
 
 Utilisation des fichiers
@@ -299,8 +302,9 @@ En plus de l'un des trois drapeaux ci-dessus, il est également possible de spé
  - ``O_CREAT`` : indique que si le fichier n'existe pas, il doit être créé lors de l'exécution de l'appel système `open(2)`_. L'appel système `creat(2)`_ peut également être utilisé pour créer un nouveau fichier. Lorsque le drapeau ``O_CREAT`` est spécifié, l'appel système `open(2)`_ prend comme troisième argument les permissions du fichier qui doit être créé. Celles-ci sont spécifiées de la même façon que pour l'appel système `chmod(2)`_. Si elles ne sont pas spécifiées, le fichier est ouvert avec comme permissions les permissions par défaut du processus définies par l'appel système `umask(2)`_
  - ``O_APPEND`` : indique que le fichier est ouvert de façon à ce que les données écrites dans le fichier par l'appel système `write(2)`_ s'ajoutent à la fin du fichier.
  - ``O_TRUNC`` : indique que si le fichier existe déjà et qu'il est ouvert en écriture, alors le contenu du fichier doit être supprimé avant que le processus ne commence à y accéder.
- - ``O_CLOEXEC`` : ce drapeau qui est spécifique à Linux indique que le fichier doit être automatiquement fermé lors de l'exécution de l'appel système `execve(2)`_. Normalement, les fichiers qui ont été ouverts par `open(2)`_ restent ouverts lors de l'exécution de `execve(2)`_.
  - ``O_SYNC`` : ce drapeau indique que toutes les opérations d'écriture sur le fichier doivent être effectuées immédiatement sur le dispositif de stockage sans être mises en attente dans les buffers du noyau du système d'exploitation
+   ..  - ``O_CLOEXEC`` : ce drapeau qui est spécifique à Linux indique que le fichier doit être automatiquement fermé lors de l'exécution de l'appel système `execve(2)`_. Normalement, les fichiers qui ont été ouverts par `open(2)`_ restent ouverts lors de l'exécution de `execve(2)`_.
+
 
 Ces différents drapeaux binaires doivent être combinés en utilisant une disjonction logique entre les différents drapeaux. Ainsi, ``O_CREAT|O_RDWR`` correspond à l'ouverture d'un fichier qui doit à la fois être créé si il n'existe pas et ouvert en lecture et écriture.
 
@@ -328,7 +332,9 @@ Toutes les opérations qui sont faites sur un fichier se font en utilisant le :t
 
 Tout processus doit correctement fermer tous les fichiers qu'il a utilisé. Par défaut, le système d'exploitation ferme automatiquement les descripteurs de fichiers correspondant ``0``, ``1`` et ``2`` lorsqu'un processus se termine. Les autres descripteurs de fichiers doivent être explicitement fermés par le processus. Si nécessaire, cela peut se faire en enregistrant une fonction permettant de fermer correctement les fichiers ouverts via `atexit(3)`_. Il faut noter que par défaut un appel à `execve(2)`_ ne ferme pas les descripteurs de fichiers ouverts par le processus. C'est nécessaire pour permettre au programme exécuté d'avoir les entrées et sorties standard voulues.
 
-Lorsqu'un fichier a été ouvert, le noyau du système d'exploitation maintient, outre les références vers l':term:`inode` du fichier, un :term:`offset pointer`. Cet :term:`offset pointer` est la position actuelle de la tête de lecture/écriture du fichier. Lorsqu'un fichier est ouvert, son :term:`offset pointer` est positionné au premier octet du fichier, sauf si le drapeau ``O_APPEND`` a été spécifié lors de l'ouverture du fichier, dans ce cas l':term:`offset pointer` est positionné juste après le dernier octet du fichier de façon à ce qu'une écriture s'ajoute à la suite du fichier.
+.. , outre les références vers l':term:`inode` du fichier,
+
+Lorsqu'un fichier a été ouvert, le noyau du système d'exploitation maintient un :term:`offset pointer`. Cet :term:`offset pointer` est la position actuelle de la tête de lecture/écriture du fichier. Lorsqu'un fichier est ouvert, son :term:`offset pointer` est positionné au premier octet du fichier, sauf si le drapeau ``O_APPEND`` a été spécifié lors de l'ouverture du fichier, dans ce cas l':term:`offset pointer` est positionné juste après le dernier octet du fichier de façon à ce qu'une écriture s'ajoute à la suite du fichier.
 
 Les deux appels systèmes permettant de lire et d'écrire dans un fichier sont respectivement `read(2)`_ et `write(2)`_.
 
@@ -365,13 +371,13 @@ Le second problème est que les fabricants de processeurs ne se sont pas mis d'a
 
 Pour comprendre ces deux techniques, regardons comment l'entier 16 bits ``0b1111111100000000`` est stocké en mémoire. En :term:`big endian`, le byte ``11111111`` sera stocké à l'adresse `x` et le byte ``00000000`` à l'adresse `x+1`. En :term:`little endian`, c'est le byte ``00000000`` qui est stocké à l'adresse `x` et le byte ``11111111`` qui est stocké à  l'adresse `x+1`. Il en va de même pour les entiers encodés sur 32 bits comme illustré dans les deux figures ci-dessous [#fendianfig]_.
 
-.. figure:: /Fichiers/fig/500px-Big-Endian.png
+.. figure:: /_static/figures/Fichiers/fig/500px-Big-Endian.png
    :align: center
    :scale: 40
 
    Ecriture d'un entier 32 bits en mémoire en `big endian`
 
-.. figure:: /Fichiers/fig/500px-Little-Endian.png
+.. figure:: /_static/figures/Fichiers/fig/500px-Little-Endian.png
    :align: center
    :scale: 40
 
@@ -426,6 +432,68 @@ Cet appel système prend trois arguments. Le premier est le :term:`descripteur d
  Dans certains cas il est utile de pouvoir dupliquer un descripteur de fichier. C'est possible avec les appels systèmes `dup(2)`_ et `dup2(2)`_. L'appel système `dup(2)`_ prend comme argument un descripteur de fichier et retourne le plus petit descripteur de fichier libre. Lorsqu'un descripteur de fichier a été dupliqué avec `dup(2)`_ les deux descripteurs de fichiers partagent le même :term:`offset pointer` et les mêmes modes d'accès au fichier.
 
 
+.. _mmap:
+
+Fichiers mappés en mémoire
+--------------------------
+
+Lorsqu'un processus Unix veut lire ou écrire des données dans un fichier, il utilise en général les appels systèmes `open(2)`_, `read(2)`_, `write(2)`_ et `close(2)`_ directement ou à travers une librairie de plus haut niveau comme la libraire d'entrées/sorties standard. Ce n'est pas la seule façon pour accéder à des données sur un dispositif de stockage. Grâce à la mémoire virtuelle, il est possible de placer le contenu d'un fichier ou d'une partie de fichier dans une zone de la mémoire du processus. Cette opération peut être effectuée en utilisant l'appel système `mmap(2)`_. Cet appel système permet de rendre un fichier accessibles directement dans la mémoire du processus. 
+
+
+
+.. code-block:: c
+
+   #include <sys/mman.h>
+
+   void *mmap(void *addr, size_t length, int prot, int flags,
+              int fd, off_t offset);
+
+
+L'appel système `mmap(2)`_ prend six arguments, c'est un des appels systèmes qui utilise le plus d'arguments. Il permet de rendre accessible une portion d'un fichier via la mémoire d'un processus. Le cinquième argument est le descripteur du fichier qui doit être mappé. Celui-ci doit avoir été préalablement ouvert avec l'appel système `open(2)`_. Le sixième argument spécifie l'offset à partir duquel le fichier doit être mappé, ``0`` correspondant au début du fichier. Le premier argument est l'adresse à laquelle la première page du fichier doit être mappée. Généralement, cet argument est mis à ``NULL`` de façon à laisser le noyau choisir l'adresse la plus appropriée. Le deuxième argument est la longueur de la zone du fichier qui doit être mappée en mémoire. Le troisième argument contient des drapeaux qui spécifient les permissions d'accès aux données mappées. Cet argument peut soit être ``PROT_NONE``, ce qui indique que la page est inaccessible soit une permission classique :
+
+ - ``PROT_EXEC``, les pages mappées contiennent des instructions qui peuvent être exécutées
+ - ``PROT_READ``, les pages mappées contiennent des données qui peuvent être lues
+ - ``PROT_WRITE``, les pages mappées contiennent des données qui peuvent être modifiées
+
+Ces drapeaux peuvent être combinés avec une disjonction logique. Le quatrième argument est un drapeau qui indique comment les pages doivent être mappées en mémoire. Ce drapeau spécifie comment un fichier qui est mappé par deux ou plusieurs processus doit être traité. Deux drapeaux sont possibles :
+
+ - ``MAP_PRIVATE``. Dans ce cas, le fichier est mappé dans chaque processus, mais si un processus modifie une page, cette modification n'est pas répercutée aux autres processus qui ont mappé le même fichier.
+ - ``MAP_SHARED``. Dans ce cas, plusieurs processus peuvent accéder et modifier la page qui est mappée en mémoire. Lorsqu'un processus modifie le contenu d'une page, la modification est visible aux autres processus. Par contre, le fichier qui est mappé en mémoire n'est modifié que lorsque le noyau du système d'exploitation décide d'écrire les données modifiées sur le dispositif de stockage. Ces écritures dépendent de nombreux facteurs, dont la charge du système. Si un processus veut être sûr des écritures sur disque des modifications qu'il a fait à un fichier mappé un mémoire, il doit exécuter l'appel système `msync(2)`_ ou supprimer le mapping via `munmap(2)`_.
+
+.. spelling::
+
+   mapping
+   
+Ces deux drapeaux peuvent dans certains cas particuliers être combinés avec d'autres drapeaux définis dans la page de manuel de `mmap(2)`_.
+
+Lorsque `mmap(2)`_ réussit, il retourne l'adresse du début de la zone mappée en mémoire. En cas d'erreur, la constante ``MAP_FAILED`` est retournée et ``errno`` est mis à jour en conséquence.
+
+L'appel système `msync(2)`_ permet de forcer l'écriture sur disque d'une zone mappée en mémoire. Le premier argument est l'adresse du début de la zone qui doit être écrite sur disque. Le deuxième argument est la longueur de la zone qui doit être écrite sur le disque. Enfin, le dernier contient un drapeau qui spécifie comment les pages correspondantes doivent être écrites sur le disque. Le drapeau ``MS_SYNC`` indique que l'appel `msync(2)`_ doit bloquer tant que les données n'ont pas été écrites. Le drapeau ``MS_ASYNC`` indique au noyau que l'écriture doit être démarrée, mais l'appel système peut se terminer avant que toutes les pages modifiées aient été écrites sur disque.
+
+.. code-block:: c
+
+   #include <sys/mman.h>
+   int msync(void *addr, size_t length, int flags);
+
+
+Lorsqu'un processus a fini d'utiliser un fichier mappé en mémoire, il doit d'abord supprimer le mapping en utilisant l'appel système `munmap(2)`_. Cet appel système prend deux arguments. Le premier doit être un multiple de la taille d'une page [#ftaillepage]_. Le second est la taille de la zone pour laquelle le mapping doit être retiré.
+
+.. code-block:: c
+
+   #include <sys/mman.h>
+
+   int munmap(void *addr, size_t length);
+
+
+A titre d'exemple d'utilisation de `mmap(2)`_ et `munmap(2)`_, le programme ci-dessous implémente l'équivalent de la commande `cp(1)`_. Il prend comme arguments deux noms de fichiers et copie le contenu du premier dans le second. La copie se fait en mappant le premier fichier entièrement en mémoire et en utilisant la fonction `memcpy(3)`_ pour réaliser la copie. Cette solution fonctionne avec de petits fichiers. Avec de gros fichiers, elle n'est pas très efficace car tout le fichier doit être mappé en mémoire.
+
+.. literalinclude:: /MemoireVirtuelle/src/cp2.c
+   :encoding: utf-8
+   :language: c
+   :start-after: ///AAA
+
+
+ 
 
 .. rubric:: Footnotes
 
@@ -441,5 +509,5 @@ Cet appel système prend trois arguments. Le premier est le :term:`descripteur d
 
 .. [#fendianfig] Source : http://en.wikipedia.org/wiki/Endianness
 
-
+.. [#ftaillepage] Il est possible d'obtenir la taille des pages utilisée sur un système via les appels `sysconf(3)`_ ou `getpagesize(2)`_
 
diff --git a/Theorie/Makefile b/Theorie/Makefile
index 9ba663ec0638a6ca8fb361a49d13c7c75fe3dfb1..091979ea0e641dd6d1090f09398beb6e56d3e736 100644
--- a/Theorie/Makefile
+++ b/Theorie/Makefile
@@ -14,7 +14,7 @@ ALLSPHINXOPTS   = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
 # the i18n builder cannot share the environment and doctrees with the others
 I18NSPHINXOPTS  = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
 
-.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext qcm projets sinf1252
+.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext qcm projets lepl1503
 
 help:
 	@echo "Please use \`make <target>' where <target> is one of"
@@ -153,9 +153,9 @@ doctest:
 	      "results in $(BUILDDIR)/doctest/output.txt."
 
 qcm:
-	@for dir in Exercices/QCM/S*; do make -C $${dir}; done
+	@for dir in ../Exercices/QCM/S*; do make -C $${dir}; done
 
 projets:
-	@for dir in Projets/P*; do [ -e $${dir}/Makefile ] && make -C $${dir}; true; done
+	@for dir in ../Projets/P*; do [ -e $${dir}/Makefile ] && make -C $${dir}; true; done
 
-sinf1252: qcm projets html latexpdf epub
+lepl1503: qcm projets html latexpdf epub
diff --git a/Theorie/Threads/coordination.rst b/Theorie/Threads/coordination.rst
index df087173da4ab3e8ba638447559c583338231144..2ddd4c9196433931f574867f93b38744a2fa92f0 100644
--- a/Theorie/Threads/coordination.rst
+++ b/Theorie/Threads/coordination.rst
@@ -131,7 +131,7 @@ Le problème des producteurs-consommateurs est un problème extrêmement fréque
 
 Ces deux types de threads communiquent en utilisant un buffer qui a une capacité limitée à `N` places comme illustré dans la figure ci-dessous.
 
-.. figure:: /Threads/figures/figures-S7-001-c.png
+.. figure:: /_static/figures/Threads/figures/figures-S7-001-c.png
    :align: center
    :scale: 80
 
@@ -210,48 +210,44 @@ Il existe différentes implémentations des threads POSIX. Les mécanismes de co
 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``
-----------------------
+..
+	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.
+	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.
 
-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.
+	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.
+	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
-
-    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 :
+	.. code-block:: c
+	    int x=1;
+	    int v[2];
+	    void f(void ) {
+	      v[0]=x;
+	      v[1]=x;
+	    }
 
-.. code-block:: nasm
+	Dans ce cas, la fonction ``f`` est traduite en la séquence d'instructions suivante :
 
-   f:
- 	movl	x, %eax
-	movl	%eax, v
-	movl	%eax, v+4
-	ret
+	.. code-block:: nasm
+	   f:
+		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
-	movl	x, %eax
-	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.
+	.. code-block:: nasm
+	   f:
+		movl	x, %eax
+		movl	%eax, v
+		movl	x, %eax
+		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. 
 
 Variables spécifiques à un thread
 ---------------------------------
@@ -368,41 +364,6 @@ La fonction `strerror_r(3)`_ évite ce problème de tableau statique en utilisan
 
 Lorsque l'on intègre des fonctions provenant de la librairie standard ou d'une autre librairie dans un programme découpé en threads, il est important de vérifier que les fonctions utilisées sont bien :term:`thread-safe`. La page de manuel `pthreads(7)`_ liste les fonctions qui ne sont pas :term:`thread-safe` dans la librairie standard.
 
-.. spelling::
-
-   Gene
-   Amdahl
-
-Loi de Amdahl
-=============
-
-En découpant un programme en threads, il est théoriquement possible d'améliorer les performances du programme en lui permettant d'exécuter plusieurs threads d'exécution simultanément. Dans certains cas, la découpe d'un programme en différents threads est naturelle et relativement facile à réaliser. Dans d'autres cas, elle est nettement plus compliquée. Pour s'en convaincre, il suffit de considérer un grand tableau contenant plusieurs centaines de millions de nombres. Considérons un programme simple qui doit trouver dans ce tableau quel est l'élément du tableau pour lequel l'application d'une fonction complexe ``f`` donne le résultat minimal. Une implémentation purement séquentielle se contenterait de parcourir l'entièreté du tableau et d'appliquer la fonction ``f`` à chacun des éléments. A la fin de son exécution, le programme retournera l'élément qui donne la valeur minimale. Un tel problème est très facile à découper en threads. Il suffit de découper le tableau en ``N`` sous-tableaux, de lancer un thread de calcul sur chaque sous-tableau et ensuite de fusionner les résultats de chaque thread.
-
-Un autre problème est de trier le contenu d'un tel tableau dans l'ordre croissant. De nombreux algorithmes séquentiels de tri existent pour ordonner un tableau. La découpe de ce problème en thread est nettement moins évidente que dans le problème précédent et les algorithmes de tri adaptés à une utilisation dans plusieurs threads ne sont pas une simple extension des algorithmes séquentiels.
-
-Dans les années 1960s, à l'époque des premières réflexions sur l'utilisation de plusieurs processeurs pour résoudre un problème, Gene Amdahl [Amdahl1967]_ a analysé quelles étaient les gains que l'on pouvait attendre de l'utilisation de plusieurs processeurs. Dans sa réflexion, il considère un programme ``P`` qui peut être découpé en deux parties :
-
- - une partie purement séquentielle. Il s'agit par exemple de l'initialisation de l'algorithme utilisé, de la collecte des résultats, ...
- - une partie qui est peut être parallélisée. Il s'agit en général du coeur de l'algorithme.
-
-Plus les opérations réalisées à l'intérieur d'un programme sont indépendantes entre elles, plus le programme fonction en parallèle et inversement. Pour Amdahl, si le temps d'exécution d'un programme séquentiel est `T` et qu'une fraction `f` de ce programme peut être parallélisée, alors le gain qui peut être obtenu de la parallélisation est :math:`\frac{T}{T \times( (1-f)+\frac{f}{N})}=\frac{1}{ (1-f)+\frac{f}{N}}` lorsque le programme est découpé en `N` threads. Cette formule, connue sous le nom de la :term:`loi de Amdahl` fixe une limite théorique sur le gain que l'on peut obtenir en parallélisant un programme. La figure ci-dessous [#famdahl]_ illustre le gain théorique que l'on peut obtenir en parallélisant un programme en fonction du nombre de processeur et pour différentes fractions parallélisées.
-
-.. figure:: /Threads/figures/500px-AmdahlsLaw.png
-   :align: center
-   :scale: 80
-
-   Loi de Amdahl (source `wikipedia <http://en.wikipedia.org/wiki/Amdahl's_law>`_)
-
-.. spelling::
-
-   profiling
-
-La loi de Amdahl doit être considérée comme un maximum théorique qui est difficile d'atteindre. Elle suppose que la parallélisation est  parfaite, c'est-à-dire que la création et la terminaison de threads n'ont pas de coût en terme de performance. En pratique, c'est loin d'être le cas et il peut être difficile d'estimer a priori le gain qu'une parallélisation permettra d'obtenir. En pratique, avant de découper un programme séquentiel en threads, il est important de bien identifier la partie séquentielle et la partie du programme pouvant être parallélisée. Si la partie séquentielle est trop importante, le gain dû à la parallélisation risque d'être faible. Si par contre la partie purement séquentielle est faible, il est possible d'obtenir théoriquement des gains élevés. Le tout sera de trouver des solutions efficaces qui permettront aux threads de fonctionner le plus indépendamment possible.
-
-En pratique, avant de s'attaquer à la découpe d'un programme séquentiel en threads, il est important de bien comprendre quelles sont les parties du programme qui sont les plus consommatrices de temps CPU. Ce seront souvent les boucles ou les grandes structures de données. Si le programme séquentiel existe, il est utile d'analyser son exécution avec des outils de `profiling` tels que `gprof(1)`_  [Graham+1982]_ ou `oprofile <http://oprofile.sourceforge.net/>`_. Un profiler est un logiciel qui permet d'analyser l'exécution d'un autre logiciel de façon à pouvoir déterminer notamment quelles sont les fonctions ou parties du programmes les plus exécutées. Ces parties de programme sont celles sur lesquelles l'effort de parallélisation devra porter en pratique.
-
-Dans un programme découpé en threads, toute utilisation de fonctions de coordination comme des sémaphores ou des mutex, bien qu'elle soit nécessaire pour la correction du programme, risque d'avoir un impact négatif sur les performances. Pour s'en convaincre, il est intéressant de réfléchir au problème des producteurs-consommateurs. Il correspond à de nombreux programmes réels. Les performances d'une implémentation du problème des producteurs consommateurs dépendront fortement de la taille du buffer entre les producteurs et les consommateurs et de leur nombre et/ou vitesses relatives. Idéalement, il faudrait que le buffer soit en moyenne rempli à moitié. De cette façon, chaque producteur pourra déposer de l'information dans le buffer et chaque consommateur pourra en retirer. Si le buffer est souvent vide, cela indique que les consommateurs sont plus rapides que les producteurs. Ces consommateurs risquent d'être inutilement bloqués, ce qui affectera les performances. Il en va de même si le buffer était plein. Dans ce cas, les producteurs seraient souvent bloqués.
-
 .. rubric:: Footnotes
 
 .. [#fSysV] Les systèmes Unix supportent également des sémaphores dits `System V` du nom de la version de Unix dans laquelle ils ont été introduits. Dans ces notes, nous nous focalisons sur les sémaphores POSIX qui ont une API un peu plus simple que les es sémaphores `System V`. Les principales fonctions pour les sémaphores `System V` sont `semget(3posix)`_, `semctl(3posix)`_ et `semop(3posix)`_.
@@ -413,7 +374,3 @@ Dans un programme découpé en threads, toute utilisation de fonctions de coordi
 .. [#fstrerror] Cette implémentation est adaptée de http://opensource.apple.com/source/gcc/gcc-926/libiberty/strerror.c et est dans le domaine public.
 
 .. [#fstrerror_r] Cette implémentation est adaptée de https://www-asim.lip6.fr/trac/netbsdtsar/browser/vendor/netbsd/5/src/lib/libc/string/strerror_r.c?rev=2 et est `Copyright (c) 1988 Regents of the University of California.`
-
-.. [#famdahl] Source : http://en.wikipedia.org/wiki/Amdahl's_law
-
-
diff --git a/Theorie/Threads/threads.rst b/Theorie/Threads/threads.rst
index 044def23dc7f0af9cdd2e4f4eb3708d30071633b..96ebd54a35757e2b45e7cb9210cf7df27e54b0c2 100644
--- a/Theorie/Threads/threads.rst
+++ b/Theorie/Threads/threads.rst
@@ -7,6 +7,8 @@
 Utilisation de plusieurs threads
 ================================
 
+.. todo: remove assembly code
+
 Les performances des microprocesseurs se sont continuellement améliorées depuis les années 1960s. Cette amélioration a été possible grâce aux progrès constants de la micro-électronique qui a permis d'assembler des microprocesseurs contenant de plus en plus de transistors sur une surface de  plus en plus réduite. La figure [#ftransistors]_ ci-dessous illustre bien cette évolution puisqu'elle représente le nombre de transistors par microprocesseur en fonction du temps.
 
 .. spelling::
@@ -15,7 +17,7 @@ Les performances des microprocesseurs se sont continuellement améliorées depui
    intel
 
 
-.. figure:: /Threads/figures/534px-Transistor_Count_and_Moore's_Law_-_2011.png
+.. figure:: /_static/figures/Threads/figures/534px-Transistor_Count_and_Moore's_Law_-_2011.png
    :align: center
 
    Evolution du nombre de transistors par microprocesseur
@@ -25,7 +27,7 @@ Cette évolution avait été prédite par Gordon Moore dans les années 1960s [S
 
 Le fonctionnement d'un microprocesseur est régulé par une horloge. Celle-ci rythme la plupart des opérations du processeur et notamment le chargement des instructions depuis la mémoire. Pendant de nombreuses années, les performances des microprocesseurs ont fortement dépendu de leur vitesse d'horloge. Les premiers microprocesseurs avaient des fréquences d'horloge de quelques centaines de :term:`kHz`. A titre d'exemple, le processeur intel 4004 avait une horloge à 740 kHz en 1971. Aujourd'hui, les processeurs rapides dépassent la fréquence de 3 :term:`GHz`. La figure ci-dessous présente l'évolution de la fréquence d'horloge des microprocesseurs depuis les années 1970s [#fperf]_. On remarque une évolution rapide jusqu'aux environs du milieu de la dernière décennie. La barrière des 10 MHz a été franchie à la fin des années 1970s. Les 100 :term:`MHz` ont étés atteints en 1994 et le GHz aux environs de l'an 2000.
 
-.. figure:: /Threads/figures/figures-001-c.png
+.. figure:: /_static/figures/Threads/figures/figures-001-c.png
    :align: center
 
    Evolution de la vitesse d'horloge des microprocesseurs
@@ -43,7 +45,7 @@ Si pendant longtemps la fréquence d'horloge d'un microprocesseur a été une bo
 Une autre façon de mesurer les performances d'un microprocesseur est de comptabiliser le nombre d'instructions qu'il exécute par seconde. On parle en général de Millions d'Instructions par Seconde (ou :term:`MIPS`). Si les premiers microprocesseurs effectuaient moins de 100.000 instructions par seconde, la barrière du MIPS a été franchie en 1979. Mesurées en MIPS, les performances des microprocesseurs ont continué à augmenter durant les dernières années malgré la barrière des 3 GHz comme le montre la figure ci-dessous.
 
 
-.. figure:: /Threads/figures/figures-002-c.png
+.. figure:: /_static/figures/Threads/figures/figures-002-c.png
    :align: center
 
    Evolution des performances des microprocesseurs en MIPS
@@ -53,7 +55,7 @@ Une autre façon de mesurer les performances d'un microprocesseur est de comptab
    Evaluation
    benchmark
    benchmarks
-   
+
 .. note:: Evaluation des performances de systèmes informatiques
 
  La fréquence d'horloge d'un processeur et le nombre d'instructions qu'il est capable d'exécuter chaque seconde ne sont que quelques uns des paramètres qui influencent les performances d'un système informatique qui intègre ce processeur. Les performances globales d'un système informatique dépendent de nombreux autres facteurs comme la capacité de mémoire et ses performances, la vitesse des bus entre les différents composants, les performances des dispositifs de stockage ou des cartes réseaux. Les performances d'un système dépendront aussi fortement du type d'application utilisé. Un serveur web, un serveur de calcul scientifique et un serveur de bases de données n'auront pas les mêmes contraintes en termes de performance. L'évaluation complète des performances d'un système informatique se fait généralement en utilisant des benchmarks. Un :term:`benchmark` est un ensemble de logiciels qui reproduisent le comportement de certaines classes d'applications de façon à pouvoir tester les performances de systèmes informatiques de façon reproductible. Différents organismes publient de tels benchmarks. Le plus connu est probablement `Standard Performance Evaluation Corporation <http://www.spec.org>`_ qui publie des benchmarks et des résultats de benchmarks pour différents types de systèmes informatiques et d'applications.
@@ -64,7 +66,9 @@ 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
 
@@ -78,49 +82,55 @@ 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 :
-
-
-.. code-block:: nasm
-
-    f:
-	subl	$16, %esp
-	movl	24(%esp), %eax
-	movl	20(%esp), %ecx
-	movl	%ecx, 12(%esp)
-	movl	%eax, 8(%esp)
-	movl	$0, 4(%esp)
-	movl	$0, (%esp)
-   .LBB0_1:
-	movl	(%esp), %eax
-	cmpl	8(%esp), %eax
-	jge	.LBB0_3
-
-	movl	12(%esp), %eax
-	movl	4(%esp), %ecx
-	addl	%eax, %ecx
-	movl	%ecx, 4(%esp)
-	movl	(%esp), %eax
-	addl	$1, %eax
-	movl	%eax, (%esp)
-	jmp	.LBB0_1
-   .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 :
+  
+..
+	En assembleur, cette fonction se traduit en :
+
+	.. code-block:: nasm
+		f:
+		subl	$16, %esp
+		movl	24(%esp), %eax
+		movl	20(%esp), %ecx
+		movl	%ecx, 12(%esp)
+		movl	%eax, 8(%esp)
+		movl	$0, 4(%esp)
+		movl	$0, (%esp)
+		.LBB0_1:
+		movl	(%esp), %eax
+		cmpl	8(%esp), %eax
+		jge	.LBB0_3
+
+		movl	12(%esp), %eax
+		movl	4(%esp), %ecx
+		addl	%eax, %ecx
+		movl	%ecx, 4(%esp)
+		movl	(%esp), %eax
+		addl	$1, %eax
+		movl	%eax, (%esp)
+		jmp	.LBB0_1
+		.LBB0_3:
+		movl	4(%esp), %eax
+		addl	$16, %esp
+		ret
+
+		.. 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 :
 
  - à 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 zones de mémoire très rapide (mais peu nombreuses) se trouvant sur le processeur qui permettent de stocker entre autres : l'adresse de l'instruction à exécuter, des résultats intermédiaires 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
@@ -129,7 +139,7 @@ Pour qu'un processeur puisse exécuter cette séquence d'instructions, il faut n
 .. spelling::
 
    multithreadé
-      
+
 Un processeur `multithreadé` a la capacité d'exécuter plusieurs programmes simultanément. En pratique, ce processeur disposera de plusieurs copies des registres. Chacun de ces blocs de registres pourra être utilisé pour exécuter ces programmes simultanément à raison d'un thread d'exécution par bloc de registres. Chaque thread d'exécution va correspondre à une séquence différente d'instructions qui va modifier son propre bloc de registres. C'est grâce à cette capacité d'exécuter plusieurs threads d'exécution simultanément que les performances en :term:`MIPS` des microprocesseurs ont pu continuer à croître alors que leur fréquence d'horloge stagnait.
 
 Cette capacité d'exécuter plusieurs threads d'exécution simultanément n'est pas limitée à un thread d'exécution par programme. Sachant qu'un thread d'exécution n'est finalement qu'une séquence d'instructions qui utilisent un bloc de registres, il est tout à fait possible à plusieurs séquences d'exécution appartenant à un même programme de s'exécuter simultanément. Si on revient à la fonction assembleur ci-dessus, il est tout à fait possible que deux invocations de cette fonction s'exécutent simultanément sur un microprocesseur. Pour démarrer une telle instance, il suffit de pouvoir initialiser le bloc de registres nécessaire à la nouvelle instance et ensuite de démarrer l'exécution à la première instruction de la fonction. En pratique, cela nécessite la coopération du système d'exploitation. Différents mécanismes ont été proposés pour permettre à un programme de lancer différents threads d'exécution. Aujourd'hui, le plus courant est connu sous le nom de threads POSIX. C'est celui que nous allons étudier en détail, mais il en existe d'autres.
@@ -223,4 +233,3 @@ Concernant `pthread_join(3)`_, le code ci-dessus illustre la récupération du r
 .. [#ftransistors] Source : http://en.wikipedia.org/wiki/File:Transistor_Count_and_Moore%27s_Law_-_2011.svg
 
 .. [#fperf] Plusieurs sites web recensent cette information, notamment http://www.intel.com/pressroom/kits/quickreffam.htm, http://en.wikipedia.org/wiki/List_of_Intel_microprocessors et http://en.wikipedia.org/wiki/Instructions_per_second
-
diff --git a/Theorie/Threads/threads2.rst b/Theorie/Threads/threads2.rst
index c5538319b49347d91d99124369dd719b47f9a729..8448971f92bdb772caa39bea9c3221396f7d923e 100644
--- a/Theorie/Threads/threads2.rst
+++ b/Theorie/Threads/threads2.rst
@@ -10,14 +10,14 @@ Communication entre threads
 Lorsque un programme a été décomposé en plusieurs threads, ceux-ci ne sont en général pas complètement indépendants et ils doivent communiquer entre eux. Cette communication entre threads est un problème complexe comme nous allons le voir. Avant d'aborder ce problème, il est utile de revenir à l'organisation d'un processus et de ses threads en mémoire. La figure ci-dessous illustre schématiquement l'organisation de la mémoire après la création d'un thread POSIX.
 
 
-.. figure:: /Threads/S6-fig/figures-001-c.png
+.. figure:: /_static/figures/Threads/S6-fig/figures-001-c.png
    :align: center
    :scale: 80
 
    Organisation de la mémoire après la création d'un thread POSIX
 
 
-Le programme principal et le thread qu'il a créé partagent trois zones de la mémoire : le :term:`segment text` qui comprend l'ensemble des instructions qui composent le programme, le :term:`segment de données` qui comprend toutes les données statiques, initialisées ou non et enfin le :term:`heap`. Autant le programme principal que son thread peuvent accéder à n'importe quelle information se trouvant en mémoire dans ces zones. Par contre, le programme principal et le thread qu'il vient de créer ont chacun leur propre contexte et leur propre pile.
+Le programme principal et le thread qu'il a créé partagent trois zones de la mémoire : le :term:`segment text` qui comprend l'ensemble des instructions qui composent le programme, le :term:`segment de données` qui comprend toutes les données statiques , initialisées ou non (c'est-à-dire les constantes, les variables globales ou encore les chaînes de caractère) et enfin le :term:`heap`. Autant le programme principal que son thread peuvent accéder à n'importe quelle information se trouvant en mémoire dans ces zones. Par contre, le programme principal et le thread qu'il vient de créer ont chacun leur propre contexte et leur propre pile.
 
 La première façon pour un processus de communiquer avec un thread qu'il a lancé est d'utiliser les arguments de la fonction de démarrage du thread et la valeur retournée par le thread que le processus principal peut récupérer via l'appel à `pthread_join(3posix)`_. C'est un canal de communication très limité qui ne permet pas d'échange d'information pendant l'exécution du thread.
 
@@ -172,7 +172,7 @@ Le deuxième type d'événement est l'exécution d'un appel système bloquant. U
 
 Ces interactions entre les threads et le système d'exploitation sont importantes. Pour bien les comprendre, il est utile de noter qu'un thread peut se trouver dans trois états différents du point de vue de son interaction avec le système d'exploitation. Ces trois états sont illustrés dans la figure ci-dessous.
 
-.. figure:: /Threads/S6-fig/figures-003-c.png
+.. figure:: /_static/figures/Threads/S6-fig/figures-003-c.png
    :align: center
    :scale: 80
 
@@ -187,7 +187,7 @@ Lorsqu'un thread est créé avec la fonction `pthread_create(3)`_, il est placé
    schedulers
    l'ordonnanceur
    l'implémentation
-   
+
 Les transitions entre les différents états d'un thread sont gérées par le système d'exploitation. Lorsque plusieurs threads d'exécution sont simultanément actifs, le système d'exploitation doit arbitrer les demandes d'utilisation du CPU de chaque thread. Cet arbitrage est réalisé par l'ordonnanceur (ou :term:`scheduler` en anglais). Le :term:`scheduler` est un ensemble d'algorithmes qui sont utilisés par le système d'exploitation pour sélectionner le ou les threads qui peuvent utiliser un processeur à un moment donné. Il y a souvent plus de threads qui sont dans l'état `Ready` que de processeurs disponibles et le scheduler doit déterminer quels sont les threads à exécuter.
 
 Une description détaillée du fonctionnement d'un scheduler relève plutôt d'un cours sur les systèmes d'exploitation que d'un premier cours sur le langage C, mais il est important de connaître les principes de base de fonctionnement de quelques schedulers.
@@ -318,4 +318,3 @@ 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`
-
diff --git a/Theorie/bib.rst b/Theorie/bib.rst
index 6514dbd33e53c5a0f7dae2cdd754ea242d242d62..9428a3455fdfd6fd648db5ee8e1847c97703d7ce 100644
--- a/Theorie/bib.rst
+++ b/Theorie/bib.rst
@@ -12,7 +12,7 @@ Bibliographie
 
 .. .. [Alagarsamy2003] Alagarsamy, K., `Some myths about famous mutual exclusion algorithms`. SIGACT News 34, 3 (September 2003), 94-103.  http://doi.acm.org/10.1145/945526.945527
 
-.. [Amdahl1967] Amdahl, G., `Validity of the Single-Processor Approach to Achieving Large-Scale Computing Capabilities`,  Proc.  Am. Federation of Information Processing Societies Conf., AFIPS Press, 1967, pp. 483-485, http://dx.doi.org/10.1145/1465482.1465560
+.. .. [Amdahl1967] Amdahl, G., `Validity of the Single-Processor Approach to Achieving Large-Scale Computing Capabilities`,  Proc.  Am. Federation of Information Processing Societies Conf., AFIPS Press, 1967, pp. 483-485, http://dx.doi.org/10.1145/1465482.1465560
 
 .. [Bashar1997] Bashar, N., `Ariane 5: Who Dunnit?`, IEEE Software 14(3): 15–16. May 1997. https://doi.ieeecomputersociety.org/10.1109/MS.1997.589224
 
@@ -52,7 +52,7 @@ Bibliographie
 
 .. [GNUPTH] Engelschall, R., `GNU Portable Threads`, http://www.gnu.org/software/pth/
 
-.. [Graham+1982] Graham, S., Kessler, P. and Mckusick, M., `Gprof: A call graph execution profiler`. SIGPLAN Not. 17, 6 (June 1982), 120-126. http://doi.acm.org/10.1145/872726.806987
+.. .. [Graham+1982] Graham, S., Kessler, P. and Mckusick, M., `Gprof: A call graph execution profiler`. SIGPLAN Not. 17, 6 (June 1982), 120-126. http://doi.acm.org/10.1145/872726.806987
 
 .. .. [HennessyPatterson] Hennessy, J. and Patterson, D., `Computer Architecture: A Quantitative Approach`, Morgan Kauffmann, http://books.google.be/books?id=gQ-fSqbLfFoC
 
@@ -173,3 +173,5 @@ Bibliographie
    Prentice
    Walls
    Microsystems
+   and
+   Sun
diff --git a/Theorie/glossaire.rst b/Theorie/glossaire.rst
index 084fe246acbba37ca09acbd0a876f82efb9c80dc..47a8ca0de9827f05fc5a1430d77e2b72fe19bef6 100644
--- a/Theorie/glossaire.rst
+++ b/Theorie/glossaire.rst
@@ -32,7 +32,7 @@ Glossaire
     Compilateur pour la langage C développé par un groupe de volontaires qui est diffusé depuis http://gcc.gnu.org gcc est utilisé dans plusieurs systèmes d'exploitation de type Unix, comme MacOS, Linux ou FreeBSD. Il existe d'autres compilateurs C. Une liste non-exhaustive est maintenue sur http://en.wikipedia.org/wiki/List_of_compilers#C_compilers
 
    llvm
-    Ensemble de compilateurs pour différents langages de programmation et différents processeurs développé par un groupe de volontaire. llvm est distrubé depuis http://llvm.org/
+    Ensemble de compilateurs pour différents langages de programmation et différents processeurs développé par un groupe de volontaire. ``llvm`` est distribué depuis http://llvm.org/
 
    cpp
    préprocesseur
@@ -40,7 +40,7 @@ Glossaire
 
    microprocesseur
    processeur
-    Unité centrale de l'ordinateur qui exécute les instructions en langage machine et interagit avec la mémoire. 
+    Unité centrale de l'ordinateur qui exécute les instructions en langage machine et interagit avec la mémoire.
 
    CPU
     Central Processing Unit. Voir :term:`microprocesseur`
@@ -154,7 +154,7 @@ Glossaire
     Fichier contenant des signatures de fonctions, des déclarations de types de données, des variables globales, permettant d'utiliser une librairie ou un API.
 
    segmentation fault
-    Erreur à l'exécution à compléter
+    Erreur à l'exécution causée par un accès à une adresse mémoire non-autorisée pour le programme.
 
    NOT
    négation
@@ -179,20 +179,20 @@ Glossaire
     Free Software Foundation, http://www.fsf.org
 
    portée
-    Zone d'un programme dans laquelle une variable est déclarée. 
+    Zone d'un programme dans laquelle une variable est déclarée.
 
    portée locale
-    Une variable ayant une portée locale est accessible uniquement dans le bloc dans lequelle elle est définie.
+    Une variable ayant une portée locale est accessible uniquement dans le bloc dans laquelle elle est définie.
 
    portée globale
-        Une variable ayant une portée globale est accessible dans tout le programme. 
+        Une variable ayant une portée globale est accessible dans tout le programme.
 
    debugger
-    Logiciel 
+    Logiciel
 
    text
    segment text
-    Partie de la mémoire d'un programme contenant les instructions en langage machine à exécuter. 
+    Partie de la mémoire d'un programme contenant les instructions en langage machine à exécuter.
 
    segment des données initialisées
     Partie de la mémoire d'un programme contenant les données initialisées dans le code source du programme ainsi que les chaînes de caractères.
@@ -203,7 +203,7 @@ Glossaire
    heap
    tas
     Partie de la mémoire d'un programme gérée par `malloc(3)`_ et `free(3)`_.
-    
+
    stack
    pile
     Partie de la mémoire d'un programme contenant les variables locales et adresses de retour des fonctions durant leur exécution.
@@ -231,7 +231,7 @@ Glossaire
     Un des inventaires des premiers ordinateurs. A défini l'architecture de base des premiers ordinateurs qui est maintenant connue comme le modèle de von Neumann [Krakowiak2011]_
 
    mémoire
-    Dispositif électronique permettant de stocker 
+    Dispositif électronique permettant de stocker
 
    SRAM
    static RAM
@@ -262,136 +262,136 @@ Glossaire
     Registre spécial du processeur qui contient en permanence l'adresse de l'instruction en cours d'exécution. Le contenu de ce registre est incrémenté après chaque instruction et modifié par les instructions de saut.
 
    makefile
-    à compléter
+    Fichier décrivant la façon dont `make(1)`_ doit compiler un programme.
 
    fichier
-    à compléter 
+    Une séquence composée d'un nombre entier d'octets stockée sur un dispositif de stockage. Un fichier est identifié par son nom et sa position dans l'arborescence du système de fichiers. 
 
    fichier objet
-    à compléter
+    Fichier résultat de la compilation d'une partie de programme. Ce fichier contient les instructions en langage machine à exécuter ainsi que les informations relatives aux différents symboles (variables, fonctions, ...) qui y sont définis.
 
    linker
-    à compléter
+    Editeur de liens. Partie du compilateur c permettant de combiner plusieurs fichiers objet en un exécutable.
 
    errno
-    à compléter
+    Variable globale mise à jour par certains appels systèmes et fonctions de la librairie standard en cas d'erreur. Voir `errno(3)`_
 
    loi de Moore
-    à compléter
+    Voir https://fr.wikipedia.org/wiki/Loi_de_Moore
 
    kHz
-    à compléter
+    Mesure de fréquence en milliers de répétitions par seconde.
 
    MHz
-    à compléter
+    Mesure de fréquence en millions de répétitions par seconde.
 
    GHz
-    à compléter
+    Mesure de fréquence en milliards de répétitions par seconde.
 
    MIPS
     Million d'instructions par seconde
 
    benchmark
-    à compléter
+    Ensemble de programmes permettant d'évaluer les performances d'un système informatique. 
 
    multi-coeurs
-    à compléter
+    Processeur contenant plusieurs unités permettant d'exécuter simultanément des instructions de programmes différents.
 
    multithreadé
-    Programme utilisant plusieurs threads. 
+    Programme utilisant plusieurs threads.
 
    section critique
     Partie de programme ne pouvant pas être exécutée simultanément par deux threads différents.
 
    exclusion mutuelle
-    à compléter
+    Zone d'un programme multithreadé qui ne peut pas être exécutée par plus d'un thread à la fois.
 
    sûreté
    safety
-    à compléter
+    Propriété d'un programme informatique. Dans le problème de l'exclusion mutuelle, une propriété de sûreté est que deux threads ne seront jamais dans la même section critique. 
 
    liveness
    vivacité
-    à compléter
+    Propriété d'un programme informatique. Dans le problème de l'exclusion mutuelle, une propriété de vivacité est qu'un thread qui souhaite entrer en section critique finira par y accéder. 
 
    multitâche
    multitasking
-    à compléter
+    Capacité d'exécuter plusieurs programmes simultanément.
 
    contexte
-    à compléter
+    Structure de données maintenue pas le noyau du système d'exploitation qui contient toutes les informations nécessaires pour poursuivre l'exécution d'un programme.
 
    changement de contexte
-    à compléter
+    Passage de l'exécution du programme A au programme B.
 
    interruption
-    à compléter
+    Signal extérieur (horloge, opération d'entrée/sortie, ...) qui force le processeur à arrêter l'exécution du programme en cours pour exécuter une routine du système d'exploitation et traiter l'interruption.
 
    scheduler
-    à compléter
+    Ordonnanceur. Algorithme utilisé par le noyau du système d'exploitation pour sélectionner le prochain programme à exécuter après une interruption d'horloge ou un appel système bloquant. 
 
    round-robin
-    à compléter
+    Voir https://fr.wikipedia.org/wiki/Round-robin_(informatique)
 
    livelock
-    à compléter
+    Voir https://en.wikipedia.org/wiki/Deadlock#Livelock
 
    opération atomique
-    à compléter
+    Opération ne pouvant être interrompue. 
 
    deadlock
-    à compléter
+    Voir https://en.wikipedia.org/wiki/Deadlock
 
    mutex
-    à compléter
+    Primitive de synchronisation permettant d'empêcher que deux threads accèdent simultanément à une même section critique.
 
    appel système
-    à compléter
+    Fonction primitive fournie par le noyau du système d'exploitation et pouvant être appelée directement par les programmes applicatifs.
 
    appel système bloquant
-    à compléter
+    Appel système qui ne retourne par de résultat immédiat. Dans ce cas, le noyau du système d'exploitation sélectionne un autre processus via le :term:`scheduler` en attendant que le résultat de l'appel système soit disponible.
 
    sémaphore
-    à compléter
+    Primitive de synchronisation permettant notamment l'exclusion mutuelle. Voir notamment  [Downey2008]_
 
    thread-safe
-    à compléter
+    Une fonction est dite thread-safe si elle peut être simultanément exécutée sans contrainte par différents threads d'un même programme.
 
    loi de Amdahl
-    à compléter
+    Voir https://fr.wikipedia.org/wiki/Loi_d%27Amdahl
 
    static library
    librairie statique
-    à compléter
+    Une librairie est statiquement liée à un programme exécutable lorsque tout son code est intégré dans l'exécutable. Voir les arguments ``static`` dans `gcc(1)`_
 
    shared library
    librairie dynamique
    librairie partagée
-    à compléter
+    Lorsqu'un librairie est dynamiquement liée à un programme exécutable, le code de celui-ci ne contient pas les instructions de la librairie, mais celle-ci est automatiquement chargée lors de chaque exécution du programme. Cela permet d'avoir une seule copie de chaque librairie. C'est la solution utilisée par défaut sous Linux. 
 
    descripteur de fichier
-    à compléter
+    Identifiant (entier) retourné par le noyau du système d'exploitation lors de l'ouverture d'un fichier par l'appel système `open(2)`_. 
 
    répertoire
-    à compléter
+    Branche de l'arborescence du système de fichiers. Un répertoire contient un ou plusieurs fichiers.
 
    répertoire courant
-    à compléter
+    Répertoire dans lequel l'appel système `open(2)`_ cherchera à ouvrir les fichiers do  
 
    offset pointer
-    à compléter
+    Position de la tête de lecture associée à un fichier ouvert. 
 
    little endian
-    à compléter
+    Ordre dans lequel les octets correspondants à des mots de plusieurs octets sont stockés en mémoire. Voir https://fr.wikipedia.org/wiki/Boutisme#Little_endian
 
    big endian
-    à compléter
+    Ordre dans lequel les octets correspondants à des mots de plusieurs octets sont stockés en mémoire. Voir https://fr.wikipedia.org/wiki/Boutisme#Little_endian
 
    lien symbolique
-    à compléter
+    Unix supporte deux types de liens. Les liens durs créés par `ln(1)`_ et les liens symboliques créés par `ln(1)`_ avec l'argument ``-s``. 
 
    appel système lent
-    à compléter
+    Un appel système lent est un appel système qui peut attendre un temps indéfini pour se terminer. Par exemple, l'appel `read(2)`_ sur l'entrée standard ne retournera de résultat que lorsque l'utilisateur aura pressé une touche sur le clavier.
 
 
    SSD
@@ -399,10 +399,81 @@ Glossaire
     Système de stockage de données s'appuyant uniquement sur de la mémoire flash.
 
    root
-    à compléter
+    Racine de l'arborescence des fichiers mais aussi utilisateur ayant les privilèges les plus élevés sur un ordinateur utilisant Unix.
 
    userid
-    à compléter
-
+    Identifiant d'utilisateur. Sous Unix, un entier unique est associé à chaque utilisateur. 
+    
    Unicode
-    Norme d'encodage de caractères supportant l'ensemble des langues écrites, voir notamment https://en.wikipedia.org/wiki/Unicode 
+    Norme d'encodage de caractères supportant l'ensemble des langues écrites, voir notamment https://en.wikipedia.org/wiki/Unicode
+
+   raspberry pi
+    Systèmes informatiques développés par la Raspberry Pi Foundation, voir https://www.raspberrypi.org
+
+
+.. spelling::
+
+   proc
+   Tanenbaum
+   Programming
+   Aqua
+   endian
+   overflow
+   Complex
+   cpp
+   deadlock
+   debugger
+   dynamic
+   eip
+   multithreadé
+   Foundation
+   garbage
+   is
+   not
+   libc
+   Torvalds
+   little
+   endian
+   liveness
+   llvm
+   livelock
+   Amdahl
+   Inc
+   Makefile
+   memory
+   leak
+   multitasking
+   multithreadé
+   nibble
+   pid
+   Access
+   Memory
+   raspberry
+   Reduced
+   root
+   scheduler
+   fault
+   shared
+   library
+   Solaris
+   Sun
+   Microsystems
+   Solid
+   static
+   library
+   stderr
+   stdin
+   stdout
+   safety
+   safe
+   lab
+   userid
+   Pentium
+   Centrino
+   Xeon
+   von
+   Neumann
+   makefile
+   coeurs
+   Labs
+   Editeur
diff --git a/Theorie/intro.rst b/Theorie/intro.rst
index 35447f806416385630297c75099f0e1639b6b6eb..66712b5bee234563f83a9e1fe6eb5016d286249e 100644
--- a/Theorie/intro.rst
+++ b/Theorie/intro.rst
@@ -23,7 +23,7 @@ Le système informatique le plus simple est composé d'un :term:`processeur` (:t
  - lire de l'information en mémoire
  - écrire de l'information en mémoire
  - réaliser des calculs
-   
+
 L'architecture des ordinateurs est basée sur l'architecture dite de Von Neumann. Suivant cette architecture, un ordinateur est composé d'un processeur qui exécute un programme se trouvant en mémoire. La mémoire contient à la fois le programme à exécuter et les données qui sont manipulées par le programme.
 
 L'élément de base pour stocker et représenter de l'information dans un système informatique est le :term:`bit`. Un bit (`binary digit` en anglais) peut prendre deux valeurs qui par convention sont représentées par :
@@ -54,6 +54,10 @@ Le processeur et la mémoire ne sont pas les deux seuls composants d'un système
  - le haut-parleur avec lequel l'ordinateur peut diffuser différentes sortes de son
  - le microphone et la caméra qui permettent à l'ordinateur de capturer des informations sonores et visuelles pour les stocker ou les traiter
 
+Les systèmes informatiques peuvent prendre différentes formes, allant de minuscules systèmes embarqués à de gigantesques supercalculateurs.
+Les :term:`raspberry pi` sont un exemple d'un système embarqué. Il s'agit de nano-ordinateurs, de la taille d'une carte de crédit.
+Possédant les mêmes composants que décrits ci-dessus, ils fonctionnent de la même façon que des systèmes plus imposants comme les ordinateurs personnels que l'on utilise au quotidien, seulement avec moins de ressources.
+
 .. spelling::
 
    API
@@ -65,6 +69,10 @@ Le processeur et la mémoire ne sont pas les deux seuls composants d'un système
    Labs
    Amsterdam
    d'Amsterdam
+   raspberry
+   pi
+   nano
+
    
 Unix
 ----
@@ -96,7 +104,7 @@ Un système Unix est composé de trois grands types de logiciels :
    Application
    Programming
    Interface
-   
+
 Le rôle principal du noyau du système d'exploitation est de gérer les ressources matérielles (processeur, mémoire, dispositifs d'entrées/sorties et de stockage) de façon à ce qu'elles soient accessibles à toutes les applications qui s'exécutent sur le système. Gérer les ressources matérielles nécessite d'inclure dans le systèmes d'exploitation des interfaces programmatiques (`Application Programming Interfaces` en anglais - :term:`API`) qui facilitent leur utilisation par les applications. Les dispositifs de stockage sont une belle illustration de ce principe. Il existe de nombreux dispositifs de stockage (disque dur, clé USB, CD, DVD, mémoire flash, ...). Chacun de ces dispositifs a des caractéristiques électriques et mécaniques propres. Ils permettent en général la lecture et/ou l'écriture de blocs de données de quelques centaines d'octets. Nous reviendrons sur leur fonctionnement ultérieurement. Peu d'applications sont capables de piloter directement de tels dispositifs pour y lire ou y écrire de tels blocs de données. Par contre, la majorité des applications sont capables de les utiliser par l'intermédiaire du système de fichiers. Le système de fichiers (arborescence des fichiers) et l'API associée (`open(2)`_, `close(2)`_, `read(2)`_ `write(2)`_ ) sont un exemple des services fournis par le système d'exploitation aux applications. Le système de fichiers regroupe l'ensemble des fichiers qui sont accessibles depuis un système sous une arborescence unique, quel que soit le nombre de dispositifs de stockage utilisé. La racine de cette arborescence est le répertoire ``/`` par convention. Ce répertoire contient généralement une dizaine de sous répertoires dont les noms varient d'une variante de Unix à l'autre. Généralement, on retrouve dans la racine les sous-répertoires suivants :
 
  - ``/usr`` : sous-répertoire contenant la plupart des utilitaires et librairies installées sur le système
@@ -113,6 +121,11 @@ Unix s'appuie sur la notion de processus. Une application est composée de un ou
 
 Dans le cadre de ce cours, nous aurons l'occasion de voir en détails de nombreuses librairies d'un système Unix et verrons le fonctionnement d'appels systèmes qui permettent aux logiciels d'interagir directement avec le noyau. Le système Unix étant majoritairement écrit en langage C, ce langage est le langage de choix pour de nombreuses applications. Nous le verrons donc en détails.
 
+Pour vous permettre de mettre vos apprentissages en pratique, vous recevrez durant le quadrimestre un `raspberry pi <https://www.raspberrypi.org/>`_. Il est possible d'installer différents systèmes d'exploitation sur celui-ci. Nous utiliserons `raspbian <https://www.raspberrypi.org/downloads/raspbian/>`_  qui est lui aussi une variante de Unix.
+
+.. spelling::
+
+   raspbian
 
 Utilitaires
 ^^^^^^^^^^^
@@ -154,8 +167,8 @@ Lorsqu'un utilisateur se connecte à un système Unix, en direct ou à travers u
         :language: console
 
 .. spelling::
-   
-                   
+
+
 La puissance du :term:`shell` ne vient pas de sa capacité d'exécuter des commandes individuelles telles que ci-dessus. Elle vient de la possibilité de combiner ces commandes en redirigeant les entrées et sorties standards. Les shells Unix supportent différentes formes de redirection. Tout d'abord, il est possible de forcer un programme à lire son entrée standard depuis un fichier plutôt que depuis le clavier. Cela se fait en ajoutant à la fin de la ligne de commande le caractère ``<`` suivi du nom du fichier à lire. Ensuite, il est possible de rediriger la sortie standard vers un fichier. Cela se fait en utilisant ``>`` ou ``>>``. Lorsqu'une commande est suivie de ``> file``, le fichier ``file`` est créé si il n'existait pas et remis à zéro si il existait et la sortie standard de cette commande est redirigée vers le fichier ``file``. Lorsqu'un commande est suivie de ``>> file``, la sortie standard est sauvegardée à la fin du fichier ``file`` (si ``file`` n'existait pas, il est créé). Des informations plus complètes sur les mécanismes de redirection de `bash(1)`_ peuvent être obtenues dans le `chapitre 20 <http://tldp.org/LDP/abs/html/io-redirection.html>`_ de [ABS]_.
 
 
diff --git a/Theorie/src/args.out b/Theorie/src/args.out
index a6518fd1b51fad21b9536524e2e82871ed25567e..04a6a27f97b316f0bd391094fce7e6d59b26bfa0 100644
--- a/Theorie/src/args.out
+++ b/Theorie/src/args.out
@@ -1,3 +1,3 @@
 Vous avez passe 2 arguments
-Le premier argument est : SINF
-Liste des arguments : SINF 1252
+Le premier argument est : LEPL
+Liste des arguments : LEPL 1503
diff --git a/Theorie/src/args.sh.out b/Theorie/src/args.sh.out
index a6518fd1b51fad21b9536524e2e82871ed25567e..04a6a27f97b316f0bd391094fce7e6d59b26bfa0 100644
--- a/Theorie/src/args.sh.out
+++ b/Theorie/src/args.sh.out
@@ -1,3 +1,3 @@
 Vous avez passe 2 arguments
-Le premier argument est : SINF
-Liste des arguments : SINF 1252
+Le premier argument est : LEPL
+Liste des arguments : LEPL 1503
diff --git a/Theorie/src/cmdline.out b/Theorie/src/cmdline.out
index 90ce18288d15f0de91ab646132fd7b5b5da9c186..13c5400cc8088301a57a4097b6774a5ecfc96966 100644
--- a/Theorie/src/cmdline.out
+++ b/Theorie/src/cmdline.out
@@ -3,4 +3,4 @@ argument[0] : ./cmdline
 argument[1] : 1
 argument[2] : -list
 argument[3] : abcdef
-argument[4] : sinf1252
+argument[4] : LEPL1503
diff --git a/Theorie/src/hellovar.sh b/Theorie/src/hellovar.sh
index d68fbf249667e1e4b3769c9cc24bdcb6fabc6771..2dfb9cfd81ef7db40452dae2eb3df110dad6c021 100644
--- a/Theorie/src/hellovar.sh
+++ b/Theorie/src/hellovar.sh
@@ -1,4 +1,4 @@
 #!/bin/bash
-PROG="SINF"
-COURS=1252
+PROG="LEPL"
+COURS=1503
 echo $PROG$COURS
diff --git a/Theorie/src/printf.c b/Theorie/src/printf.c
index 42d2d8abe8182e558d47188c8386d2b4a63a3e2c..00e98c5f0d7aaab47b02745c4f09cacfddb3e6f5 100644
--- a/Theorie/src/printf.c
+++ b/Theorie/src/printf.c
@@ -14,7 +14,7 @@ int main( int argc, char *argv[] ) {
   int day=1;
   int hour=12;
   int min=42;
-  char str[]="SINF1252";
+  char str[]="LEPL1503";
   int i;
   // affichage de la date et l'heure
   printf("%s, %s %d, %d:%d\n", weekday, month, day, hour, min);
diff --git a/Theorie/src/printf.out b/Theorie/src/printf.out
index 52d6f66f96fec16dcee9f506fd22d0dfbc4dfa1f..437d3ce012156d21e130bce20f133026c7d0a59f 100644
--- a/Theorie/src/printf.out
+++ b/Theorie/src/printf.out
@@ -1,10 +1,10 @@
 Monday, April 1, 12:42
 PI = 3.141593
-S
-I
-N
-F
+L
+E
+P
+L
 1
-2
 5
-2
+0
+3
diff --git a/Vagrantfile b/Vagrantfile
index a89d7d105f864a85f43923c84c9fbd62aa44bd36..d1d82482ffbc20e0de0e50bf17f11e8afa2942d1 100644
--- a/Vagrantfile
+++ b/Vagrantfile
@@ -46,7 +46,7 @@ Vagrant.configure(2) do |config|
   config.vm.provider "virtualbox" do |vb|
      # Display the VirtualBox GUI when booting the machine
      vb.gui = false
-  
+
      # Customize the amount of memory on the VM:
      vb.memory = "2048"
   end
@@ -69,6 +69,11 @@ Vagrant.configure(2) do |config|
      sudo apt-get install -y python-sphinx
      sudo apt-get install -y make
      sudo apt-get install -y git
+     sudo apt-get install -y texlive-latex-base
+     sudo apt-get install -y texlive-latex-extra
+     sudo apt-get install -y texlive-fonts-recommended
+     sudo apt-get install -y python-sphinxcontrib.spelling
+     sudo apt-get install -y hunspell hunspell-fr       
   SHELL
    #     sudo apt-get install -y python-setuptools
    #     sudo apt-get install -y mscgen
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/figures/C/S2-src/array.c b/_static/figures/C/S2-src/array.c
new file mode 100644
index 0000000000000000000000000000000000000000..b9414f65d61180245ce5cf181f7ec6bb0f3ba488
--- /dev/null
+++ b/_static/figures/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/figures/C/S2-src/arrayvar.c b/_static/figures/C/S2-src/arrayvar.c
new file mode 100644
index 0000000000000000000000000000000000000000..eb5c7a77039b4678ee0d40a4c70eebfbbc1a3af5
--- /dev/null
+++ b/_static/figures/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/figures/C/S2-src/char-addr.c b/_static/figures/C/S2-src/char-addr.c
new file mode 100644
index 0000000000000000000000000000000000000000..667a1f2b944c03623ea68a40679086cc04b3e2f2
--- /dev/null
+++ b/_static/figures/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/figures/C/S2-src/char.c b/_static/figures/C/S2-src/char.c
new file mode 100644
index 0000000000000000000000000000000000000000..657e37b3bd10f813cf1bcdc90776f2a1c9d66061
--- /dev/null
+++ b/_static/figures/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/figures/C/S2-src/exprbin.c b/_static/figures/C/S2-src/exprbin.c
new file mode 100644
index 0000000000000000000000000000000000000000..405d3f1b6a2546985dfd2407348da6a0e9012f85
--- /dev/null
+++ b/_static/figures/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/figures/C/S2-src/exprbin.out b/_static/figures/C/S2-src/exprbin.out
new file mode 100644
index 0000000000000000000000000000000000000000..01ca81de56e2d8d0cafd5cd17632a1891de76154
--- /dev/null
+++ b/_static/figures/C/S2-src/exprbin.out
@@ -0,0 +1,4 @@
+~ 00000000 = 11111111
+11111010 & 01011111 = 01011010
+11111010 | 01011111 = 11111111
+11111010 ^ 01011111 = 10100101
diff --git a/_static/figures/C/S2-src/fct.c b/_static/figures/C/S2-src/fct.c
new file mode 100644
index 0000000000000000000000000000000000000000..4c407b0d9d932105c8d4bf5364912320c79c5374
--- /dev/null
+++ b/_static/figures/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/figures/C/S2-src/fct.h b/_static/figures/C/S2-src/fct.h
new file mode 100644
index 0000000000000000000000000000000000000000..5f423f84bd19fb926bdee8cb4a03b22a5dfba740
--- /dev/null
+++ b/_static/figures/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/figures/C/S2-src/fct.out b/_static/figures/C/S2-src/fct.out
new file mode 100644
index 0000000000000000000000000000000000000000..8c4f1575eff2047ccbdceacd2ea44afa1bc2df53
--- /dev/null
+++ b/_static/figures/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/figures/C/S2-src/fctargs.c b/_static/figures/C/S2-src/fctargs.c
new file mode 100644
index 0000000000000000000000000000000000000000..a08a229a46cb03841fd895888dcfbde383864d44
--- /dev/null
+++ b/_static/figures/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/figures/C/S2-src/foobar.c b/_static/figures/C/S2-src/foobar.c
new file mode 100644
index 0000000000000000000000000000000000000000..c54fe40d0e88999c739aff1f8cf84b72dbcfd54f
--- /dev/null
+++ b/_static/figures/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/figures/C/S2-src/int2bin.c b/_static/figures/C/S2-src/int2bin.c
new file mode 100644
index 0000000000000000000000000000000000000000..f0cf288853724c63857dfeaf4c4a9e9045e50373
--- /dev/null
+++ b/_static/figures/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/figures/C/S2-src/num.c b/_static/figures/C/S2-src/num.c
new file mode 100644
index 0000000000000000000000000000000000000000..d0f045decb10c5e20191f04f0b22e96da13525c2
--- /dev/null
+++ b/_static/figures/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/figures/C/S2-src/octal.c b/_static/figures/C/S2-src/octal.c
new file mode 100644
index 0000000000000000000000000000000000000000..b2796c9659f5e477b0693577e47652ae64a8bec2
--- /dev/null
+++ b/_static/figures/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/figures/C/S2-src/perf.c b/_static/figures/C/S2-src/perf.c
new file mode 100644
index 0000000000000000000000000000000000000000..a31da934037b771956cf3979fcec0aa30e8e76ef
--- /dev/null
+++ b/_static/figures/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/figures/C/S2-src/ptr.c b/_static/figures/C/S2-src/ptr.c
new file mode 100644
index 0000000000000000000000000000000000000000..1e02c8fe1bd24418e7a238fc206c17df91fc66ad
--- /dev/null
+++ b/_static/figures/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/figures/C/S2-src/ptr.out b/_static/figures/C/S2-src/ptr.out
new file mode 100644
index 0000000000000000000000000000000000000000..a4ade1396ffc919267443e148d49a006958ab8a1
--- /dev/null
+++ b/_static/figures/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/figures/C/S2-src/ptrchar.c b/_static/figures/C/S2-src/ptrchar.c
new file mode 100644
index 0000000000000000000000000000000000000000..ce253e2f81fc1c80e041b526da00d805fc0992d7
--- /dev/null
+++ b/_static/figures/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/figures/C/S2-src/ptrex.c b/_static/figures/C/S2-src/ptrex.c
new file mode 100644
index 0000000000000000000000000000000000000000..7b7cbb6372b0435ac9a92569188033451d298337
--- /dev/null
+++ b/_static/figures/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/figures/C/S2-src/ptrex.out b/_static/figures/C/S2-src/ptrex.out
new file mode 100644
index 0000000000000000000000000000000000000000..43314a5863d5a297306b4d406f22bc75cc79afa1
--- /dev/null
+++ b/_static/figures/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/figures/C/S2-src/random.c b/_static/figures/C/S2-src/random.c
new file mode 100644
index 0000000000000000000000000000000000000000..51a211f80a795a4ed2c328969ecf2604cc06ba37
--- /dev/null
+++ b/_static/figures/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/figures/C/S2-src/short.c b/_static/figures/C/S2-src/short.c
new file mode 100644
index 0000000000000000000000000000000000000000..f7452beab3cc1923aaae496e3776fadd53162994
--- /dev/null
+++ b/_static/figures/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/figures/C/S2-src/short.out b/_static/figures/C/S2-src/short.out
new file mode 100644
index 0000000000000000000000000000000000000000..eb18f95164070ca249dba78e92402d38223be12e
--- /dev/null
+++ b/_static/figures/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/figures/C/S2-src/sizeof.c b/_static/figures/C/S2-src/sizeof.c
new file mode 100644
index 0000000000000000000000000000000000000000..1f604959c96f3b7e25265f9ce7e452a8b2d99969
--- /dev/null
+++ b/_static/figures/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/figures/C/S2-src/sizeofptr.c b/_static/figures/C/S2-src/sizeofptr.c
new file mode 100644
index 0000000000000000000000000000000000000000..29a2b7cdfcdadc71103bf67fe0f117c39bab687f
--- /dev/null
+++ b/_static/figures/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/figures/C/S2-src/strlen.c b/_static/figures/C/S2-src/strlen.c
new file mode 100644
index 0000000000000000000000000000000000000000..a623e5b6ddaa0e85a280872e674c821bcab382bc
--- /dev/null
+++ b/_static/figures/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/figures/C/S2-src/strlenptr.c b/_static/figures/C/S2-src/strlenptr.c
new file mode 100644
index 0000000000000000000000000000000000000000..7030859576476982b386f674b81805cec6bae7c8
--- /dev/null
+++ b/_static/figures/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/figures/C/S2-src/struct.c b/_static/figures/C/S2-src/struct.c
new file mode 100644
index 0000000000000000000000000000000000000000..dac885b590fce623c5e37e4cda0142ecbdc39972
--- /dev/null
+++ b/_static/figures/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/figures/C/S2-src/structptr.c b/_static/figures/C/S2-src/structptr.c
new file mode 100644
index 0000000000000000000000000000000000000000..59b93ebda18435e2ab1eb0d91204b9326039073e
--- /dev/null
+++ b/_static/figures/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/figures/C/S2-src/time.c b/_static/figures/C/S2-src/time.c
new file mode 100644
index 0000000000000000000000000000000000000000..3b082a83db74d7d7a100510ebb54995d832ddab6
--- /dev/null
+++ b/_static/figures/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/figures/C/S2-src/toupper.c b/_static/figures/C/S2-src/toupper.c
new file mode 100644
index 0000000000000000000000000000000000000000..cf87bc40a7795e9dc56e9fcedc28f523570e28a3
--- /dev/null
+++ b/_static/figures/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/figures/C/S2-src/typedef.c b/_static/figures/C/S2-src/typedef.c
new file mode 100644
index 0000000000000000000000000000000000000000..988cd9dedbfc60e92b3ab19b60e9e36d2447e491
--- /dev/null
+++ b/_static/figures/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/figures/C/S2-src/xor.c b/_static/figures/C/S2-src/xor.c
new file mode 100644
index 0000000000000000000000000000000000000000..9466a8228fae60901803ac6d8651831afbfc5e46
--- /dev/null
+++ b/_static/figures/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/figures/C/S3-src/argv-env.c b/_static/figures/C/S3-src/argv-env.c
new file mode 100644
index 0000000000000000000000000000000000000000..7800144572cd51b561dfecbcb55ec4d4f309e9bf
--- /dev/null
+++ b/_static/figures/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/figures/C/S3-src/callocperf.c b/_static/figures/C/S3-src/callocperf.c
new file mode 100644
index 0000000000000000000000000000000000000000..5707955a4e9a3bf6b30553bf121af6f107cd24ff
--- /dev/null
+++ b/_static/figures/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/figures/C/S3-src/const.c b/_static/figures/C/S3-src/const.c
new file mode 100644
index 0000000000000000000000000000000000000000..ee0077524db848061a6294ec4a5dff3ebda2a0d6
--- /dev/null
+++ b/_static/figures/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/figures/C/S3-src/dataseg.c b/_static/figures/C/S3-src/dataseg.c
new file mode 100644
index 0000000000000000000000000000000000000000..9f4cb34767e2ee3510068e0663ba3fed7ad98224
--- /dev/null
+++ b/_static/figures/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/figures/C/S3-src/dataseg.out b/_static/figures/C/S3-src/dataseg.out
new file mode 100644
index 0000000000000000000000000000000000000000..9a372e29ce61182f94e9cfcc47b7500e46f0b880
--- /dev/null
+++ b/_static/figures/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/figures/C/S3-src/empty.c b/_static/figures/C/S3-src/empty.c
new file mode 100644
index 0000000000000000000000000000000000000000..80fa49285f10109c0d13737be89f09262169e13a
--- /dev/null
+++ b/_static/figures/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/figures/C/S3-src/enum.c b/_static/figures/C/S3-src/enum.c
new file mode 100644
index 0000000000000000000000000000000000000000..63b4776777d25f444678edb0609dd34aa7ff33f6
--- /dev/null
+++ b/_static/figures/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/figures/C/S3-src/exhaust-stack.c b/_static/figures/C/S3-src/exhaust-stack.c
new file mode 100644
index 0000000000000000000000000000000000000000..c177bd4f88473ce2a61aa0c784f8cd4e61423936
--- /dev/null
+++ b/_static/figures/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/figures/C/S3-src/fact.c b/_static/figures/C/S3-src/fact.c
new file mode 100644
index 0000000000000000000000000000000000000000..2ea01e9c3c44e7fa686d140e4029bbc9c7f000fd
--- /dev/null
+++ b/_static/figures/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/figures/C/S3-src/fact.out b/_static/figures/C/S3-src/fact.out
new file mode 100644
index 0000000000000000000000000000000000000000..c2698ff8d11222fd32a4b8b1c39b581a87a69a6e
--- /dev/null
+++ b/_static/figures/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/figures/C/S3-src/getpid.c b/_static/figures/C/S3-src/getpid.c
new file mode 100644
index 0000000000000000000000000000000000000000..916a5945629a6a9a86c87c49430054703d7612aa
--- /dev/null
+++ b/_static/figures/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/figures/C/S3-src/initvar.c b/_static/figures/C/S3-src/initvar.c
new file mode 100644
index 0000000000000000000000000000000000000000..80d027c38be42f74e0b004414524dfb60afe2af5
--- /dev/null
+++ b/_static/figures/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/figures/C/S3-src/initvar.out b/_static/figures/C/S3-src/initvar.out
new file mode 100644
index 0000000000000000000000000000000000000000..c54a887c8ffc40c19e46a3545f4f8dbea7461dd3
--- /dev/null
+++ b/_static/figures/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/figures/C/S3-src/malloc.c b/_static/figures/C/S3-src/malloc.c
new file mode 100644
index 0000000000000000000000000000000000000000..3474c744e2f24fa3c9c20641a48dcb1d8360125c
--- /dev/null
+++ b/_static/figures/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/figures/C/S3-src/malloc.out b/_static/figures/C/S3-src/malloc.out
new file mode 100644
index 0000000000000000000000000000000000000000..44c87d400d19e800815c1417e2ad5f8afbbc403a
--- /dev/null
+++ b/_static/figures/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/figures/C/S3-src/mallocinit.c b/_static/figures/C/S3-src/mallocinit.c
new file mode 100644
index 0000000000000000000000000000000000000000..645ac40c80d69e26f5942c925473770b2fa402cf
--- /dev/null
+++ b/_static/figures/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/figures/C/S3-src/mallocinit.out b/_static/figures/C/S3-src/mallocinit.out
new file mode 100644
index 0000000000000000000000000000000000000000..14d3a6866425c4b8c15441d8a9126042e94fbf6b
--- /dev/null
+++ b/_static/figures/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/figures/C/S3-src/mallocperf.c b/_static/figures/C/S3-src/mallocperf.c
new file mode 100644
index 0000000000000000000000000000000000000000..291a614ef74b22ed36ac4ce39e4e2165f3c58f13
--- /dev/null
+++ b/_static/figures/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/figures/C/S3-src/nofree.c b/_static/figures/C/S3-src/nofree.c
new file mode 100644
index 0000000000000000000000000000000000000000..2308e6dd424ae16df84572eca4b4d8a880881c81
--- /dev/null
+++ b/_static/figures/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/figures/C/S3-src/portee.c b/_static/figures/C/S3-src/portee.c
new file mode 100644
index 0000000000000000000000000000000000000000..12ed7d94290b12b052c4e85cb7aa191cce5f3bbd
--- /dev/null
+++ b/_static/figures/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/figures/C/S3-src/portee.out b/_static/figures/C/S3-src/portee.out
new file mode 100644
index 0000000000000000000000000000000000000000..c2034d21514472921f1e95e0288e6fdf51c620f2
--- /dev/null
+++ b/_static/figures/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/figures/C/S3-src/stack.c b/_static/figures/C/S3-src/stack.c
new file mode 100644
index 0000000000000000000000000000000000000000..db62dc7800b84962af464eca7bd6d491785f0bfb
--- /dev/null
+++ b/_static/figures/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/figures/C/S3-src/stack.out b/_static/figures/C/S3-src/stack.out
new file mode 100644
index 0000000000000000000000000000000000000000..a3b08610b0c5642b458c409301b0bf3012021999
--- /dev/null
+++ b/_static/figures/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/figures/C/S3-src/static.c b/_static/figures/C/S3-src/static.c
new file mode 100644
index 0000000000000000000000000000000000000000..5d369ef57c81805549e8d8c6d4ebcaf08d5ba7a0
--- /dev/null
+++ b/_static/figures/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/figures/C/S3-src/strcat.c b/_static/figures/C/S3-src/strcat.c
new file mode 100644
index 0000000000000000000000000000000000000000..f1a785048b18706b070b983c04ccb3be8fcafd69
--- /dev/null
+++ b/_static/figures/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/figures/C/S3-src/strcpy.c b/_static/figures/C/S3-src/strcpy.c
new file mode 100644
index 0000000000000000000000000000000000000000..c24c942b69aa6eb22145f49239beb62b5ce87d09
--- /dev/null
+++ b/_static/figures/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/figures/C/S3-src/structargs.c b/_static/figures/C/S3-src/structargs.c
new file mode 100644
index 0000000000000000000000000000000000000000..a8fc564afa05822c54ecdd3bd835a82989078485
--- /dev/null
+++ b/_static/figures/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/figures/C/S3-src/typecast.c b/_static/figures/C/S3-src/typecast.c
new file mode 100644
index 0000000000000000000000000000000000000000..5093e47386b25e7db546629d16b9c259fb8df5bb
--- /dev/null
+++ b/_static/figures/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/figures/C/S3-src/union.c b/_static/figures/C/S3-src/union.c
new file mode 100644
index 0000000000000000000000000000000000000000..9951e915f6ebacea9cfa148363eaf283030175d5
--- /dev/null
+++ b/_static/figures/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/figures/C/S3-src/var.c b/_static/figures/C/S3-src/var.c
new file mode 100644
index 0000000000000000000000000000000000000000..4ce1462aa121293a39baf57f087a6dca78b42b75
--- /dev/null
+++ b/_static/figures/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/figures/C/S3-src/vector.c b/_static/figures/C/S3-src/vector.c
new file mode 100644
index 0000000000000000000000000000000000000000..d41579c3e55a0bac3702941e812cefdedb5039e6
--- /dev/null
+++ b/_static/figures/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/figures/C/S5-src/Makefile2 b/_static/figures/C/S5-src/Makefile2
new file mode 100644
index 0000000000000000000000000000000000000000..9f43fcadd9455f1b955e8f59c63e7fa3d8ce9244
--- /dev/null
+++ b/_static/figures/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/figures/C/S5-src/errno.c b/_static/figures/C/S5-src/errno.c
new file mode 100644
index 0000000000000000000000000000000000000000..4c0a4ec790bb622f03dfdb9a0714063f065c1950
--- /dev/null
+++ b/_static/figures/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/figures/C/S5-src/fctptr.c b/_static/figures/C/S5-src/fctptr.c
new file mode 100644
index 0000000000000000000000000000000000000000..c9b68d53b0d4231dd3e6f9348b13263c5ed3c031
--- /dev/null
+++ b/_static/figures/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/figures/C/S5-src/main.c b/_static/figures/C/S5-src/main.c
new file mode 100644
index 0000000000000000000000000000000000000000..01130f8a563511b4851a98873a0e95f937025024
--- /dev/null
+++ b/_static/figures/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/figures/C/S5-src/min.c b/_static/figures/C/S5-src/min.c
new file mode 100644
index 0000000000000000000000000000000000000000..1a0c53f81b43a18e0c0be95f386570b256c0cfef
--- /dev/null
+++ b/_static/figures/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/figures/C/S5-src/min.h b/_static/figures/C/S5-src/min.h
new file mode 100644
index 0000000000000000000000000000000000000000..7812a4fe350d83e1b36316adc991c0355efe4f25
--- /dev/null
+++ b/_static/figures/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/figures/C/S5-src/module.c b/_static/figures/C/S5-src/module.c
new file mode 100644
index 0000000000000000000000000000000000000000..a8f6204ae63f555734b0d31f3fd6285b5915bad7
--- /dev/null
+++ b/_static/figures/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/figures/C/S5-src/module.h b/_static/figures/C/S5-src/module.h
new file mode 100644
index 0000000000000000000000000000000000000000..cbfdb4ccc758a6b2c35d734c86f61ec7ba6cb261
--- /dev/null
+++ b/_static/figures/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/figures/C/S5-src/mystrtol.c b/_static/figures/C/S5-src/mystrtol.c
new file mode 100644
index 0000000000000000000000000000000000000000..3cfbfdc267ac23810a787a128d3110798f254138
--- /dev/null
+++ b/_static/figures/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/figures/C/S5-src/prog.c b/_static/figures/C/S5-src/prog.c
new file mode 100644
index 0000000000000000000000000000000000000000..538d4f8a4b0aa521664f00e9169d11dd8fa3556d
--- /dev/null
+++ b/_static/figures/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/figures/C/S5-src/prog.out b/_static/figures/C/S5-src/prog.out
new file mode 100644
index 0000000000000000000000000000000000000000..95f658621a9fdc78dda8a325d1a33dace5f76d29
--- /dev/null
+++ b/_static/figures/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/figures/C/S5-src/ptrptr.c b/_static/figures/C/S5-src/ptrptr.c
new file mode 100644
index 0000000000000000000000000000000000000000..1044c2a914f7f8902b5257fd951ec34e529fbdd3
--- /dev/null
+++ b/_static/figures/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/figures/C/S5-src/qsort.c b/_static/figures/C/S5-src/qsort.c
new file mode 100644
index 0000000000000000000000000000000000000000..3e834bba35d90ebcebafc19a92e954a0e72d5723
--- /dev/null
+++ b/_static/figures/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/figures/C/S5-src/strtol.c b/_static/figures/C/S5-src/strtol.c
new file mode 100644
index 0000000000000000000000000000000000000000..b1755d6fa8bdd9d8dea44720458583bbe5539441
--- /dev/null
+++ b/_static/figures/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/figures/C/S5-src/strtol.out b/_static/figures/C/S5-src/strtol.out
new file mode 100644
index 0000000000000000000000000000000000000000..58f9b96802b3183d71b2b2296f9a86d2e9eb9026
--- /dev/null
+++ b/_static/figures/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/figures/C/figures/figures-001-c.png b/_static/figures/C/figures/figures-001-c.png
new file mode 100644
index 0000000000000000000000000000000000000000..99354a4e0b5a8d096dda4ede22f501ff937d0e5f
Binary files /dev/null and b/_static/figures/C/figures/figures-001-c.png differ
diff --git a/_static/figures/C/figures/figures-007-c.png b/_static/figures/C/figures/figures-007-c.png
new file mode 100644
index 0000000000000000000000000000000000000000..79332d99e8efb28736d8d949a0e7505f33a46306
Binary files /dev/null and b/_static/figures/C/figures/figures-007-c.png differ
diff --git a/_static/figures/C/src/cmdline.c b/_static/figures/C/src/cmdline.c
new file mode 100644
index 0000000000000000000000000000000000000000..9d9ec77ec8633c2c38cad7829629ae8fdcb674c5
--- /dev/null
+++ b/_static/figures/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/figures/C/src/cmdline.out b/_static/figures/C/src/cmdline.out
new file mode 100644
index 0000000000000000000000000000000000000000..90ce18288d15f0de91ab646132fd7b5b5da9c186
--- /dev/null
+++ b/_static/figures/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] : sinf1252
diff --git a/_static/figures/C/src/failure.c b/_static/figures/C/src/failure.c
new file mode 100644
index 0000000000000000000000000000000000000000..321885bf51dee70fcb61f2959e7145ea0da70476
--- /dev/null
+++ b/_static/figures/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/figures/C/src/filterdigit.c b/_static/figures/C/src/filterdigit.c
new file mode 100644
index 0000000000000000000000000000000000000000..f242bef2aacceec6c8fb990f213498cc434af4e3
--- /dev/null
+++ b/_static/figures/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/figures/C/src/hello.c b/_static/figures/C/src/hello.c
new file mode 100644
index 0000000000000000000000000000000000000000..a616435889fe024f86372035270f10f245e443ef
--- /dev/null
+++ b/_static/figures/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/figures/C/src/printf.c b/_static/figures/C/src/printf.c
new file mode 100644
index 0000000000000000000000000000000000000000..a10b63583210a468cb32cadf440af5192ef3eb1f
--- /dev/null
+++ b/_static/figures/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/figures/C/src/printf.out b/_static/figures/C/src/printf.out
new file mode 100644
index 0000000000000000000000000000000000000000..52d6f66f96fec16dcee9f506fd22d0dfbc4dfa1f
--- /dev/null
+++ b/_static/figures/C/src/printf.out
@@ -0,0 +1,10 @@
+Monday, April 1, 12:42
+PI = 3.141593
+S
+I
+N
+F
+1
+2
+5
+2
diff --git a/_static/figures/C/src/ptr_arith.c b/_static/figures/C/src/ptr_arith.c
new file mode 100644
index 0000000000000000000000000000000000000000..a4fe502d3f8e3240fbda0ae56bc75c33d923fa66
--- /dev/null
+++ b/_static/figures/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/figures/C/src/string.c b/_static/figures/C/src/string.c
new file mode 100644
index 0000000000000000000000000000000000000000..7970ef7065d43a5a19c23e586b86e79cb248ced2
--- /dev/null
+++ b/_static/figures/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/figures/C/svg/Float_example.png b/_static/figures/C/svg/Float_example.png
new file mode 100644
index 0000000000000000000000000000000000000000..fde60d9ec96ab8eefb67dc7be3c7c8094df637fe
Binary files /dev/null and b/_static/figures/C/svg/Float_example.png differ
diff --git a/_static/figures/C/svg/Float_example.svg b/_static/figures/C/svg/Float_example.svg
new file mode 100644
index 0000000000000000000000000000000000000000..4e875ef641eacf30a336cd6169fbfdf9e65e339d
--- /dev/null
+++ b/_static/figures/C/svg/Float_example.svg
@@ -0,0 +1,715 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   version="1.0"
+   width="590"
+   height="75"
+   id="svg2">
+  <defs
+     id="defs4">
+    <marker
+       refX="0"
+       refY="0"
+       orient="auto"
+       style="overflow:visible"
+       id="Arrow2Mend">
+      <path
+         d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.97309,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+         transform="scale(-0.6,-0.6)"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         id="path3321" />
+    </marker>
+  </defs>
+  <rect
+     width="120.00082"
+     height="26.023895"
+     x="29.259886"
+     y="28.699614"
+     style="fill:none;fill-opacity:0.39473685;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+     id="rect3147" />
+  <rect
+     width="14.999176"
+     height="26.023895"
+     x="134.26152"
+     y="28.699369"
+     style="fill:#10ff2e;fill-opacity:0.39607843;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+     id="rect3522" />
+  <path
+     d="M 30.239243,25.223251 L 30.239243,15.797501 L 148.37786,15.797501 L 148.37786,25.223251"
+     style="fill:none;fill-rule:evenodd;stroke:#008000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+     id="path2170" />
+  <path
+     d="M 150.26069,25.223251 L 150.26069,15.797501 L 493.40792,15.797501 L 493.40792,25.223251"
+     style="fill:none;fill-rule:evenodd;stroke:#800000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+     id="path2172" />
+  <rect
+     width="345.97119"
+     height="26.023642"
+     x="149.25989"
+     y="28.66995"
+     style="fill:none;fill-opacity:0.36078431;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+     id="rect2174" />
+  <rect
+     width="14.999176"
+     height="26.023895"
+     x="14.260694"
+     y="28.699369"
+     style="fill:#0af5ff;fill-opacity:0.23684214;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+     id="rect3149" />
+  <text
+     x="28.313053"
+     y="11.141996"
+     style="font-size:14.64121246px;font-style:normal;text-align:end;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Gill Sans MT"
+     id="text3151"
+     xml:space="preserve"><tspan
+       x="28.313053"
+       y="11.141996"
+       style="font-weight:normal;text-align:end;text-anchor:end;font-family:Arial"
+       id="tspan3153">sign</tspan></text>
+  <text
+     x="89.090508"
+     y="11.141996"
+     style="font-size:14.64121246px;font-style:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Gill Sans MT"
+     id="text3369"
+     xml:space="preserve"><tspan
+       x="89.090508"
+       y="11.141996"
+       style="font-weight:normal;font-family:Arial"
+       id="tspan3371">exponent (8 bits)</tspan></text>
+  <text
+     x="322.27396"
+     y="11.141996"
+     style="font-size:14.64121246px;font-style:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Gill Sans MT"
+     id="text3377"
+     xml:space="preserve"><tspan
+       x="322.27396"
+       y="11.141996"
+       style="font-weight:normal;font-family:Arial"
+       id="tspan3379">fraction (23 bits)</tspan></text>
+  <path
+     d="M 489.73149,59.223243 C 489.73224,59.938278 489.35121,60.599322 488.7321,60.957058 C 488.11299,61.314795 487.34999,61.314795 486.73088,60.957058 C 486.11176,60.599322 485.73074,59.938278 485.73149,59.223243 C 485.73074,58.508207 486.11176,57.847163 486.73088,57.489428 C 487.34999,57.131691 488.11299,57.131691 488.7321,57.489428 C 489.35121,57.847163 489.73224,58.508207 489.73149,59.223243 L 489.73149,59.223243 z "
+     style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+     id="path3381" />
+  <text
+     x="487.77948"
+     y="74.338959"
+     style="font-size:14.04066658px;font-style:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial"
+     id="text3383"
+     xml:space="preserve"><tspan
+       x="487.77948"
+       y="74.338959"
+       style="font-weight:normal"
+       id="tspan3385">0</tspan></text>
+  <path
+     d="M 143.7611,59.223253 C 143.76185,59.938288 143.38082,60.599332 142.76171,60.957068 C 142.1426,61.314805 141.3796,61.314805 140.76049,60.957068 C 140.14137,60.599332 139.76035,59.938288 139.7611,59.223253 C 139.76035,58.508217 140.14137,57.847173 140.76049,57.489438 C 141.3796,57.131701 142.1426,57.131701 142.76171,57.489438 C 143.38082,57.847173 143.76185,58.508217 143.7611,59.223253 L 143.7611,59.223253 z "
+     style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+     id="path3397" />
+  <text
+     x="139.87766"
+     y="74.338959"
+     style="font-size:14.04066658px;font-style:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial"
+     id="text3399"
+     xml:space="preserve"><tspan
+       x="139.87766"
+       y="74.338959"
+       style="font-weight:normal"
+       id="tspan3401">23</tspan></text>
+  <path
+     d="M 23.760282,59.223253 C 23.761036,59.938288 23.380007,60.599332 22.760896,60.957068 C 22.141785,61.314805 21.37878,61.314805 20.759669,60.957068 C 20.140558,60.599332 19.75953,59.938288 19.760284,59.223253 C 19.75953,58.508217 20.140558,57.847173 20.759669,57.489438 C 21.37878,57.131701 22.141785,57.131701 22.760896,57.489438 C 23.380007,57.847173 23.761036,58.508217 23.760282,59.223253 L 23.760282,59.223253 z "
+     style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+     id="path3413" />
+  <text
+     x="19.256382"
+     y="74.338959"
+     style="font-size:14.04066658px;font-style:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial"
+     id="text3415"
+     xml:space="preserve"><tspan
+       x="19.256382"
+       y="74.338959"
+       style="font-weight:normal"
+       id="tspan3417">31</tspan></text>
+  <path
+     d="M 21.760283,25.223251 L 21.760283,15.797501"
+     style="fill:none;fill-rule:evenodd;stroke:#008080;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+     id="path2232" />
+  <rect
+     width="14.999176"
+     height="26.023895"
+     x="119.26128"
+     y="28.699369"
+     style="fill:#10ff2e;fill-opacity:0.39607843;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+     id="rect3508" />
+  <rect
+     width="14.999176"
+     height="26.023895"
+     x="104.26105"
+     y="28.699369"
+     style="fill:#10ff2e;fill-opacity:0.39607843;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+     id="rect3510" />
+  <rect
+     width="14.999176"
+     height="26.023895"
+     x="89.260818"
+     y="28.699369"
+     style="fill:#10ff2e;fill-opacity:0.39607843;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+     id="rect3512" />
+  <rect
+     width="14.999176"
+     height="26.023895"
+     x="74.260582"
+     y="28.699369"
+     style="fill:#10ff2e;fill-opacity:0.39607843;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+     id="rect3514" />
+  <rect
+     width="14.999176"
+     height="26.023895"
+     x="59.260353"
+     y="28.699369"
+     style="fill:#10ff2e;fill-opacity:0.39607843;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+     id="rect3516" />
+  <rect
+     width="14.999176"
+     height="26.023895"
+     x="44.260117"
+     y="28.699369"
+     style="fill:#10ff2e;fill-opacity:0.39607843;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+     id="rect3518" />
+  <rect
+     width="14.999176"
+     height="26.023895"
+     x="29.259886"
+     y="28.699369"
+     style="fill:#10ff2e;fill-opacity:0.39607843;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+     id="rect3520" />
+  <rect
+     width="14.999176"
+     height="26.023895"
+     x="149.25989"
+     y="28.699369"
+     style="fill:#ff1e1e;fill-opacity:0.36078431;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+     id="rect3525" />
+  <rect
+     width="14.999176"
+     height="26.023895"
+     x="164.30408"
+     y="28.699369"
+     style="fill:#ff1e1e;fill-opacity:0.36078431;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+     id="rect3533" />
+  <rect
+     width="14.999176"
+     height="26.023895"
+     x="179.34825"
+     y="28.699369"
+     style="fill:#ff1e1e;fill-opacity:0.36078431;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+     id="rect3535" />
+  <rect
+     width="14.999176"
+     height="26.023895"
+     x="194.39244"
+     y="28.699369"
+     style="fill:#ff1e1e;fill-opacity:0.36078431;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+     id="rect3537" />
+  <rect
+     width="14.999176"
+     height="26.023895"
+     x="209.43661"
+     y="28.699369"
+     style="fill:#ff1e1e;fill-opacity:0.36078431;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+     id="rect3539" />
+  <rect
+     width="14.999176"
+     height="26.023895"
+     x="224.4808"
+     y="28.699369"
+     style="fill:#ff1e1e;fill-opacity:0.36078431;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+     id="rect3541" />
+  <rect
+     width="14.999176"
+     height="26.023895"
+     x="239.52499"
+     y="28.699369"
+     style="fill:#ff1e1e;fill-opacity:0.36078431;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+     id="rect3543" />
+  <rect
+     width="14.999176"
+     height="26.023895"
+     x="254.56917"
+     y="28.699369"
+     style="fill:#ff1e1e;fill-opacity:0.36078431;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+     id="rect3545" />
+  <rect
+     width="14.999176"
+     height="26.023895"
+     x="269.61334"
+     y="28.699369"
+     style="fill:#ff1e1e;fill-opacity:0.36078431;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+     id="rect3547" />
+  <rect
+     width="14.999176"
+     height="26.023895"
+     x="284.65753"
+     y="28.699369"
+     style="fill:#ff1e1e;fill-opacity:0.36078431;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+     id="rect3549" />
+  <rect
+     width="14.999176"
+     height="26.023895"
+     x="299.70172"
+     y="28.699369"
+     style="fill:#ff1e1e;fill-opacity:0.36078431;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+     id="rect3551" />
+  <rect
+     width="14.999176"
+     height="26.023895"
+     x="314.74591"
+     y="28.699369"
+     style="fill:#ff1e1e;fill-opacity:0.36078431;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+     id="rect3553" />
+  <rect
+     width="14.999176"
+     height="26.023895"
+     x="329.7901"
+     y="28.699369"
+     style="fill:#ff1e1e;fill-opacity:0.36078431;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+     id="rect3555" />
+  <rect
+     width="14.999176"
+     height="26.023895"
+     x="344.83429"
+     y="28.699369"
+     style="fill:#ff1e1e;fill-opacity:0.36078431;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+     id="rect3557" />
+  <rect
+     width="14.999176"
+     height="26.023895"
+     x="359.87845"
+     y="28.699369"
+     style="fill:#ff1e1e;fill-opacity:0.36078431;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+     id="rect3559" />
+  <rect
+     width="14.999176"
+     height="26.023895"
+     x="374.92264"
+     y="28.699369"
+     style="fill:#ff1e1e;fill-opacity:0.36078431;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+     id="rect3561" />
+  <rect
+     width="14.999176"
+     height="26.023895"
+     x="389.96683"
+     y="28.699369"
+     style="fill:#ff1e1e;fill-opacity:0.36078431;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+     id="rect3563" />
+  <rect
+     width="14.999176"
+     height="26.023895"
+     x="405.01102"
+     y="28.699369"
+     style="fill:#ff1e1e;fill-opacity:0.36078431;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+     id="rect3565" />
+  <rect
+     width="14.999176"
+     height="26.023895"
+     x="420.05521"
+     y="28.699369"
+     style="fill:#ff1e1e;fill-opacity:0.36078431;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+     id="rect3567" />
+  <rect
+     width="14.999176"
+     height="26.023895"
+     x="435.09937"
+     y="28.699369"
+     style="fill:#ff1e1e;fill-opacity:0.36078431;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+     id="rect3569" />
+  <rect
+     width="14.999176"
+     height="26.023895"
+     x="450.14355"
+     y="28.699369"
+     style="fill:#ff1e1e;fill-opacity:0.36078431;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+     id="rect3571" />
+  <rect
+     width="14.999176"
+     height="26.023895"
+     x="465.18774"
+     y="28.699369"
+     style="fill:#ff1e1e;fill-opacity:0.36078431;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+     id="rect3573" />
+  <rect
+     width="14.999176"
+     height="26.023895"
+     x="480.2319"
+     y="28.699369"
+     style="fill:#ff1e1e;fill-opacity:0.36078431;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+     id="rect3575" />
+  <text
+     x="22.288181"
+     y="46.757179"
+     style="font-size:14.04066658px;font-style:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial"
+     id="text3581"
+     xml:space="preserve"><tspan
+       x="22.288181"
+       y="46.757179"
+       style="font-weight:normal"
+       id="tspan3583">0</tspan></text>
+  <text
+     x="37.319508"
+     y="46.757179"
+     style="font-size:14.04066658px;font-style:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial"
+     id="text3585"
+     xml:space="preserve"><tspan
+       x="37.319508"
+       y="46.757179"
+       style="font-weight:normal"
+       id="tspan3587">0</tspan></text>
+  <text
+     x="52.350842"
+     y="46.757179"
+     style="font-size:14.04066658px;font-style:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial"
+     id="text3589"
+     xml:space="preserve"><tspan
+       x="52.350842"
+       y="46.757179"
+       style="font-weight:normal"
+       id="tspan3591">1</tspan></text>
+  <text
+     x="67.382164"
+     y="46.757179"
+     style="font-size:14.04066658px;font-style:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial"
+     id="text3593"
+     xml:space="preserve"><tspan
+       x="67.382164"
+       y="46.757179"
+       style="font-weight:normal"
+       id="tspan3595">1</tspan></text>
+  <text
+     x="82.413498"
+     y="46.757179"
+     style="font-size:14.04066658px;font-style:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial"
+     id="text3597"
+     xml:space="preserve"><tspan
+       x="82.413498"
+       y="46.757179"
+       style="font-weight:normal"
+       id="tspan3599">1</tspan></text>
+  <text
+     x="97.444824"
+     y="46.757179"
+     style="font-size:14.04066658px;font-style:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial"
+     id="text3601"
+     xml:space="preserve"><tspan
+       x="97.444824"
+       y="46.757179"
+       style="font-weight:normal"
+       id="tspan3603">1</tspan></text>
+  <text
+     x="112.47616"
+     y="46.757179"
+     style="font-size:14.04066658px;font-style:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial"
+     id="text3605"
+     xml:space="preserve"><tspan
+       x="112.47616"
+       y="46.757179"
+       style="font-weight:normal"
+       id="tspan3607">1</tspan></text>
+  <text
+     x="127.50748"
+     y="46.757179"
+     style="font-size:14.04066658px;font-style:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial"
+     id="text3609"
+     xml:space="preserve"><tspan
+       x="127.50748"
+       y="46.757179"
+       style="font-weight:normal"
+       id="tspan3611">0</tspan></text>
+  <text
+     x="142.53882"
+     y="46.757179"
+     style="font-size:14.04066658px;font-style:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial"
+     id="text3613"
+     xml:space="preserve"><tspan
+       x="142.53882"
+       y="46.757179"
+       style="font-weight:normal"
+       id="tspan3615">0</tspan></text>
+  <text
+     x="157.57016"
+     y="46.757179"
+     style="font-size:14.04066658px;font-style:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial"
+     id="text3617"
+     xml:space="preserve"><tspan
+       x="157.57016"
+       y="46.757179"
+       style="font-weight:normal"
+       id="tspan3619">0</tspan></text>
+  <text
+     x="172.60149"
+     y="46.757179"
+     style="font-size:14.04066658px;font-style:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial"
+     id="text3621"
+     xml:space="preserve"><tspan
+       x="172.60149"
+       y="46.757179"
+       style="font-weight:normal"
+       id="tspan3623">1</tspan></text>
+  <text
+     x="187.63281"
+     y="46.757179"
+     style="font-size:14.04066658px;font-style:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial"
+     id="text3625"
+     xml:space="preserve"><tspan
+       x="187.63281"
+       y="46.757179"
+       style="font-weight:normal"
+       id="tspan3627">0</tspan></text>
+  <text
+     x="202.66414"
+     y="46.757179"
+     style="font-size:14.04066658px;font-style:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial"
+     id="text3629"
+     xml:space="preserve"><tspan
+       x="202.66414"
+       y="46.757179"
+       style="font-weight:normal"
+       id="tspan3631">0</tspan></text>
+  <text
+     x="217.69548"
+     y="46.757179"
+     style="font-size:14.04066658px;font-style:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial"
+     id="text3633"
+     xml:space="preserve"><tspan
+       x="217.69548"
+       y="46.757179"
+       style="font-weight:normal"
+       id="tspan3635">0</tspan></text>
+  <text
+     x="232.72681"
+     y="46.757179"
+     style="font-size:14.04066658px;font-style:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial"
+     id="text3637"
+     xml:space="preserve"><tspan
+       x="232.72681"
+       y="46.757179"
+       style="font-weight:normal"
+       id="tspan3639">0</tspan></text>
+  <text
+     x="247.75813"
+     y="46.757179"
+     style="font-size:14.04066658px;font-style:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial"
+     id="text3641"
+     xml:space="preserve"><tspan
+       x="247.75813"
+       y="46.757179"
+       style="font-weight:normal"
+       id="tspan3643">0</tspan></text>
+  <text
+     x="262.78946"
+     y="46.757179"
+     style="font-size:14.04066658px;font-style:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial"
+     id="text3645"
+     xml:space="preserve"><tspan
+       x="262.78946"
+       y="46.757179"
+       style="font-weight:normal"
+       id="tspan3647">0</tspan></text>
+  <text
+     x="277.82077"
+     y="46.757179"
+     style="font-size:14.04066658px;font-style:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial"
+     id="text3649"
+     xml:space="preserve"><tspan
+       x="277.82077"
+       y="46.757179"
+       style="font-weight:normal"
+       id="tspan3651">0</tspan></text>
+  <text
+     x="292.85211"
+     y="46.757179"
+     style="font-size:14.04066658px;font-style:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial"
+     id="text3653"
+     xml:space="preserve"><tspan
+       x="292.85211"
+       y="46.757179"
+       style="font-weight:normal"
+       id="tspan3655">0</tspan></text>
+  <text
+     x="307.88345"
+     y="46.757179"
+     style="font-size:14.04066658px;font-style:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial"
+     id="text3657"
+     xml:space="preserve"><tspan
+       x="307.88345"
+       y="46.757179"
+       style="font-weight:normal"
+       id="tspan3659">0</tspan></text>
+  <text
+     x="322.91476"
+     y="46.757179"
+     style="font-size:14.04066658px;font-style:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial"
+     id="text3661"
+     xml:space="preserve"><tspan
+       x="322.91476"
+       y="46.757179"
+       style="font-weight:normal"
+       id="tspan3663">0</tspan></text>
+  <text
+     x="337.94611"
+     y="46.757179"
+     style="font-size:14.04066658px;font-style:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial"
+     id="text3665"
+     xml:space="preserve"><tspan
+       x="337.94611"
+       y="46.757179"
+       style="font-weight:normal"
+       id="tspan3667">0</tspan></text>
+  <text
+     x="352.97742"
+     y="46.757179"
+     style="font-size:14.04066658px;font-style:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial"
+     id="text3669"
+     xml:space="preserve"><tspan
+       x="352.97742"
+       y="46.757179"
+       style="font-weight:normal"
+       id="tspan3671">0</tspan></text>
+  <text
+     x="368.00876"
+     y="46.757179"
+     style="font-size:14.04066658px;font-style:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial"
+     id="text3673"
+     xml:space="preserve"><tspan
+       x="368.00876"
+       y="46.757179"
+       style="font-weight:normal"
+       id="tspan3675">0</tspan></text>
+  <text
+     x="383.0401"
+     y="46.757179"
+     style="font-size:14.04066658px;font-style:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial"
+     id="text3677"
+     xml:space="preserve"><tspan
+       x="383.0401"
+       y="46.757179"
+       style="font-weight:normal"
+       id="tspan3679">0</tspan></text>
+  <text
+     x="398.07141"
+     y="46.757179"
+     style="font-size:14.04066658px;font-style:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial"
+     id="text3681"
+     xml:space="preserve"><tspan
+       x="398.07141"
+       y="46.757179"
+       style="font-weight:normal"
+       id="tspan3683">0</tspan></text>
+  <text
+     x="413.10275"
+     y="46.757179"
+     style="font-size:14.04066658px;font-style:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial"
+     id="text3685"
+     xml:space="preserve"><tspan
+       x="413.10275"
+       y="46.757179"
+       style="font-weight:normal"
+       id="tspan3687">0</tspan></text>
+  <text
+     x="428.13409"
+     y="46.757179"
+     style="font-size:14.04066658px;font-style:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial"
+     id="text3689"
+     xml:space="preserve"><tspan
+       x="428.13409"
+       y="46.757179"
+       style="font-weight:normal"
+       id="tspan3691">0</tspan></text>
+  <text
+     x="443.16541"
+     y="46.757179"
+     style="font-size:14.04066658px;font-style:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial"
+     id="text3693"
+     xml:space="preserve"><tspan
+       x="443.16541"
+       y="46.757179"
+       style="font-weight:normal"
+       id="tspan3695">0</tspan></text>
+  <text
+     x="458.19675"
+     y="46.757179"
+     style="font-size:14.04066658px;font-style:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial"
+     id="text3697"
+     xml:space="preserve"><tspan
+       x="458.19675"
+       y="46.757179"
+       style="font-weight:normal"
+       id="tspan3699">0</tspan></text>
+  <text
+     x="473.22806"
+     y="46.757179"
+     style="font-size:14.04066658px;font-style:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial"
+     id="text3701"
+     xml:space="preserve"><tspan
+       x="473.22806"
+       y="46.757179"
+       style="font-weight:normal"
+       id="tspan3703">0</tspan></text>
+  <text
+     x="488.2594"
+     y="46.757179"
+     style="font-size:14.04066658px;font-style:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial"
+     id="text3705"
+     xml:space="preserve"><tspan
+       x="488.2594"
+       y="46.757179"
+       style="font-weight:normal"
+       id="tspan3707">0</tspan></text>
+  <text
+     x="504.2641"
+     y="48.399105"
+     style="font-size:18.6884346px;font-style:normal;text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial"
+     id="text3709"
+     xml:space="preserve"><tspan
+       x="504.2641"
+       y="48.399105"
+       style="font-weight:normal;text-align:start;text-anchor:start"
+       id="tspan3711">= 0.15625</tspan></text>
+  <path
+     d="M 38.759473,59.223253 C 38.760227,59.938288 38.379198,60.599332 37.760087,60.957068 C 37.140976,61.314805 36.377971,61.314805 35.75886,60.957068 C 35.139749,60.599332 34.758721,59.938288 34.759475,59.223253 C 34.758721,58.508217 35.139749,57.847173 35.75886,57.489438 C 36.377971,57.131701 37.140976,57.131701 37.760087,57.489438 C 38.379198,57.847173 38.760227,58.508217 38.759473,59.223253 L 38.759473,59.223253 z "
+     style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+     id="path3959" />
+  <text
+     x="39.756992"
+     y="74.338959"
+     style="font-size:14.04066658px;font-style:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial"
+     id="text3961"
+     xml:space="preserve"><tspan
+       x="39.756992"
+       y="74.338959"
+       style="font-weight:normal"
+       id="tspan3963">30</tspan></text>
+  <path
+     d="M 158.75948,59.223253 C 158.76023,59.938288 158.3792,60.599332 157.76009,60.957068 C 157.14098,61.314805 156.37798,61.314805 155.75887,60.957068 C 155.13975,60.599332 154.75873,59.938288 154.75948,59.223253 C 154.75873,58.508217 155.13975,57.847173 155.75887,57.489438 C 156.37798,57.131701 157.14098,57.131701 157.76009,57.489438 C 158.3792,57.847173 158.76023,58.508217 158.75948,59.223253 L 158.75948,59.223253 z "
+     style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+     id="path3965" />
+  <text
+     x="158.87602"
+     y="74.338959"
+     style="font-size:14.04066658px;font-style:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial"
+     id="text3967"
+     xml:space="preserve"><tspan
+       x="158.87602"
+       y="74.338959"
+       style="font-weight:normal"
+       id="tspan3969">22</tspan></text>
+  <text
+     x="255.87602"
+     y="74.338959"
+     style="font-size:14.04066658px;font-style:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial"
+     id="text3971"
+     xml:space="preserve"><tspan
+       x="255.87602"
+       y="74.338959"
+       style="font-weight:normal"
+       id="tspan3973">(bit index)</tspan></text>
+</svg>
diff --git a/_static/figures/Fichiers/fig/500px-Big-Endian.png b/_static/figures/Fichiers/fig/500px-Big-Endian.png
new file mode 100644
index 0000000000000000000000000000000000000000..2c2bb0166d3e0cb903ab8bfd0858b0a0e5436444
Binary files /dev/null and b/_static/figures/Fichiers/fig/500px-Big-Endian.png differ
diff --git a/_static/figures/Fichiers/fig/500px-Little-Endian.png b/_static/figures/Fichiers/fig/500px-Little-Endian.png
new file mode 100644
index 0000000000000000000000000000000000000000..38341bb472f73db3732bd9e05da01c6685dc6b77
Binary files /dev/null and b/_static/figures/Fichiers/fig/500px-Little-Endian.png differ
diff --git a/_static/figures/Fichiers/fig/Big-Endian.svg b/_static/figures/Fichiers/fig/Big-Endian.svg
new file mode 100644
index 0000000000000000000000000000000000000000..9fb208d1f2f24f7f0b7d29735979528747cd6856
--- /dev/null
+++ b/_static/figures/Fichiers/fig/Big-Endian.svg
@@ -0,0 +1,363 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   version="1.0"
+   width="280"
+   height="250"
+   id="svg2328">
+  <defs
+     id="defs2330">
+    <marker
+       refX="0"
+       refY="0"
+       orient="auto"
+       style="overflow:visible"
+       id="Arrow1Lend">
+      <path
+         d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z "
+         transform="matrix(-0.8,0,0,-0.8,-10,0)"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         id="path3194" />
+    </marker>
+  </defs>
+  <g
+     id="layer1">
+    <g
+       transform="translate(-33,-16)"
+       id="g3480">
+      <g
+         transform="translate(10.684927,10)"
+         id="g2641">
+        <g
+           transform="translate(-4.9999999,5.0000001)"
+           id="g2707">
+          <g
+             transform="translate(-182,-39)"
+             id="g3414">
+            <g
+               transform="translate(74.324543,139.79415)"
+               style="stroke:none"
+               id="g2177">
+              <path
+                 d="M 194.97975,115.0099 L 194.97975,85.205848 L 224.99053,85.205848 L 224.99053,115.0099 L 194.97975,115.0099 z "
+                 style="fill:#ffffff;stroke:none;stroke-width:0.42571709;overflow:visible"
+                 id="path2179" />
+              <text
+                 x="210.48268"
+                 y="106.59099"
+                 style="font-size:20px;font-style:normal;font-weight:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial Black"
+                 id="text2181"
+                 xml:space="preserve"><tspan
+                   x="210.48268"
+                   y="106.59099"
+                   style="font-size:18px;stroke:none"
+                   id="tspan2183">0D</tspan></text>
+            </g>
+            <g
+               transform="translate(74.324543,49.794155)"
+               style="stroke:none"
+               id="g3180">
+              <path
+                 d="M 194.97975,115.0099 L 194.97975,85.205848 L 224.99053,85.205848 L 224.99053,115.0099 L 194.97975,115.0099 z "
+                 style="fill:#ffffff;stroke:none;stroke-width:0.42571709;overflow:visible"
+                 id="path3182" />
+              <text
+                 x="210.48268"
+                 y="106.59099"
+                 style="font-size:20px;font-style:normal;font-weight:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial Black"
+                 id="text3184"
+                 xml:space="preserve"><tspan
+                   x="210.48268"
+                   y="106.59099"
+                   style="font-size:18px;stroke:none"
+                   id="tspan3186">0A</tspan></text>
+            </g>
+            <g
+               transform="translate(74.324543,79.794155)"
+               style="stroke:none"
+               id="g3188">
+              <path
+                 d="M 194.97975,115.0099 L 194.97975,85.205848 L 224.99053,85.205848 L 224.99053,115.0099 L 194.97975,115.0099 z "
+                 style="fill:#ffffff;stroke:none;stroke-width:0.42571709;overflow:visible"
+                 id="path3190" />
+              <text
+                 x="210.48268"
+                 y="106.59099"
+                 style="font-size:20px;font-style:normal;font-weight:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial Black"
+                 id="text3192"
+                 xml:space="preserve"><tspan
+                   x="210.48268"
+                   y="106.59099"
+                   style="font-size:18px;stroke:none"
+                   id="tspan3194">0B</tspan></text>
+            </g>
+            <g
+               transform="translate(74.324543,109.79415)"
+               style="stroke:none"
+               id="g3196">
+              <path
+                 d="M 194.97975,115.0099 L 194.97975,85.205848 L 224.99053,85.205848 L 224.99053,115.0099 L 194.97975,115.0099 z "
+                 style="fill:#ffffff;stroke:none;stroke-width:0.42571709;overflow:visible"
+                 id="path3198" />
+              <text
+                 x="210.48268"
+                 y="106.59099"
+                 style="font-size:20px;font-style:normal;font-weight:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial Black"
+                 id="text3200"
+                 xml:space="preserve"><tspan
+                   x="210.48268"
+                   y="106.59099"
+                   style="font-size:18px;stroke:none"
+                   id="tspan3202">0C</tspan></text>
+            </g>
+            <path
+               d="M 269.57222,255.25715 L 299.05792,255.42779"
+               style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.51429158;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+               id="path2185" />
+            <path
+               d="M 269.68311,120.31689 L 269.63196,269.68311"
+               style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.6337797;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+               id="path3158" />
+            <path
+               d="M 299.68311,120.31689 L 299.63195,269.68311"
+               style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.63377368;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+               id="path3168" />
+            <path
+               d="M 269.57222,225.25715 L 299.05792,225.42779"
+               style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.51429158;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+               id="path3170" />
+            <path
+               d="M 269.57222,194.57221 L 299.05792,194.74285"
+               style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.51429158;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+               id="path3172" />
+            <path
+               d="M 269.57222,165.25715 L 299.05792,165.42779"
+               style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.51429158;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+               id="path3174" />
+            <path
+               d="M 269.57222,135.25715 L 299.05792,135.42779"
+               style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.51429158;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+               id="path3178" />
+            <g
+               transform="translate(63.764862,76.892123)"
+               style="stroke:none"
+               id="g3204">
+              <text
+                 x="49.333466"
+                 y="-219.84514"
+                 transform="matrix(0,1,-1,0,0,0)"
+                 style="font-size:20px;font-style:normal;font-weight:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial Black"
+                 id="text3208"
+                 xml:space="preserve"><tspan
+                   x="49.333466"
+                   y="-219.84514"
+                   style="font-size:18px;stroke:none;font-family:Times New Roman"
+                   id="tspan3210">...</tspan></text>
+              <text
+                 x="187.58347"
+                 y="-219.84514"
+                 transform="matrix(0,1,-1,0,0,0)"
+                 style="font-size:20px;font-style:normal;font-weight:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial Black"
+                 id="text3212"
+                 xml:space="preserve"><tspan
+                   x="187.58347"
+                   y="-219.84514"
+                   style="font-size:18px;stroke:none;font-family:Times New Roman"
+                   id="tspan3214">...</tspan></text>
+              <g
+                 transform="translate(69.065073,85.25)"
+                 style="stroke:none;stroke-opacity:1"
+                 id="g3279">
+                <rect
+                   width="40"
+                   height="25"
+                   x="96.485138"
+                   y="67.85788"
+                   style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+                   id="rect3281" />
+                <text
+                   x="133.96561"
+                   y="82.861786"
+                   style="font-size:18px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
+                   id="text3283"
+                   xml:space="preserve"><tspan
+                     x="133.96561"
+                     y="82.861786"
+                     style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:end;line-height:125%;writing-mode:lr-tb;text-anchor:end;stroke:none;stroke-opacity:1;font-family:Times New Roman"
+                     id="tspan3285"><tspan
+   style="font-size:18px;font-style:italic;text-align:end;text-anchor:end;stroke:none;stroke-opacity:1"
+   id="tspan3287">a</tspan>+3:</tspan></text>
+              </g>
+              <g
+                 transform="translate(69.065073,55.25)"
+                 style="stroke:none;stroke-opacity:1"
+                 id="g3309">
+                <rect
+                   width="40"
+                   height="25"
+                   x="96.485138"
+                   y="67.85788"
+                   style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+                   id="rect3311" />
+                <text
+                   x="133.96561"
+                   y="82.861786"
+                   style="font-size:18px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
+                   id="text3313"
+                   xml:space="preserve"><tspan
+                     x="133.96561"
+                     y="82.861786"
+                     style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:end;line-height:125%;writing-mode:lr-tb;text-anchor:end;stroke:none;stroke-opacity:1;font-family:Times New Roman"
+                     id="tspan3315"><tspan
+   style="font-size:18px;font-style:italic;text-align:end;text-anchor:end;stroke:none;stroke-opacity:1"
+   id="tspan3317">a</tspan>+2:</tspan></text>
+              </g>
+              <g
+                 transform="translate(69.065073,25.25)"
+                 style="stroke:none;stroke-opacity:1"
+                 id="g3319">
+                <rect
+                   width="40"
+                   height="25"
+                   x="96.485138"
+                   y="67.85788"
+                   style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+                   id="rect3321" />
+                <text
+                   x="133.96561"
+                   y="82.861786"
+                   style="font-size:18px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
+                   id="text3323"
+                   xml:space="preserve"><tspan
+                     x="133.96561"
+                     y="82.861786"
+                     style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:end;line-height:125%;writing-mode:lr-tb;text-anchor:end;stroke:none;stroke-opacity:1;font-family:Times New Roman"
+                     id="tspan3325"><tspan
+   style="font-size:18px;font-style:italic;text-align:end;text-anchor:end;stroke:none;stroke-opacity:1"
+   id="tspan3327">a</tspan>+1:</tspan></text>
+              </g>
+              <g
+                 transform="translate(69.065073,-4.7500002)"
+                 style="stroke:none;stroke-opacity:1"
+                 id="g3329">
+                <rect
+                   width="40"
+                   height="25"
+                   x="96.485138"
+                   y="67.85788"
+                   style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+                   id="rect3331" />
+                <text
+                   x="133.96561"
+                   y="82.861786"
+                   style="font-size:18px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
+                   id="text3333"
+                   xml:space="preserve"><tspan
+                     x="133.96561"
+                     y="82.861786"
+                     style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:end;line-height:125%;writing-mode:lr-tb;text-anchor:end;stroke:none;stroke-opacity:1;font-family:Times New Roman"
+                     id="tspan3335"><tspan
+   style="font-size:18px;font-style:italic;text-align:end;text-anchor:end;stroke:none;stroke-opacity:1"
+   id="tspan3337">a</tspan>:</tspan></text>
+              </g>
+            </g>
+            <text
+               x="282.54688"
+               y="105.59375"
+               style="font-size:16px;font-style:normal;font-weight:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
+               id="text3347"
+               xml:space="preserve"><tspan
+                 x="282.54688"
+                 y="105.59375"
+                 id="tspan3349">Memory</tspan></text>
+          </g>
+          <text
+             x="218.93581"
+             y="33.109375"
+             style="font-size:16px;font-style:normal;font-weight:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
+             id="text3343"
+             xml:space="preserve"><tspan
+               x="218.93581"
+               y="33.109375"
+               id="tspan3345">Register</tspan></text>
+          <text
+             x="208.28125"
+             y="222.54688"
+             style="font-size:16px;font-style:normal;font-weight:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
+             id="text3351"
+             xml:space="preserve"><tspan
+               x="208.28125"
+               y="222.54688"
+               id="tspan3353">Big-endian</tspan></text>
+          <g
+             id="g2631">
+            <g
+               transform="translate(124.339,5.779998)"
+               id="g2363">
+              <path
+                 d="M 34.109876,69.331124 L 34.109876,36.668878 L 155.89012,36.668878 L 155.89012,69.331124 L 34.109876,69.331124 z "
+                 style="fill:#ffffff;stroke:#000000;stroke-width:0.89775217;overflow:visible"
+                 id="path2340" />
+              <text
+                 x="95"
+                 y="60"
+                 style="font-size:16px;font-style:normal;font-weight:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial Black"
+                 id="text2359"
+                 xml:space="preserve"><tspan
+                   x="95"
+                   y="60"
+                   style="font-size:20px"
+                   id="tspan2361">0A0B0C0D</tspan></text>
+            </g>
+            <g
+               id="g2250">
+              <path
+                 d="M 260.6875,75.09375 L 261.5,199.59375 L 124,200.5 L 124,201.5 L 262,200.625 L 262.53125,200.59375 L 262.53125,200.09375 L 261.71875,75.09375 L 260.6875,75.09375 z "
+                 style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.02955723px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline"
+                 id="path2215" />
+              <path
+                 d="M 134.29535,200.9325 L 138.38649,196.78736 L 124,201 L 138.44049,205.02364 L 134.29535,200.9325 z "
+                 style="fill-rule:evenodd;stroke:#000000;stroke-width:0.82364578pt;marker-start:none"
+                 id="path2256" />
+            </g>
+            <g
+               id="g2242">
+              <path
+                 d="M 232.6875,75 L 231.96875,170.875 L 123.5,171 L 123.5,172 L 232.46875,171.875 L 232.96875,171.875 L 232.96875,171.375 L 233.6875,75 L 232.6875,75 z "
+                 style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline"
+                 id="path3388" />
+              <path
+                 d="M 133.49999,171.48944 L 137.49577,167.48521 L 123.5,171.5 L 137.50422,175.48521 L 133.49999,171.48944 z "
+                 style="fill-rule:evenodd;stroke:#000000;stroke-width:0.8pt;marker-start:none"
+                 id="path2248" />
+            </g>
+            <g
+               id="g2234">
+              <path
+                 d="M 201.625,75.375 L 202.125,140.0625 L 124,141 L 124,142 L 202.65625,141.0625 L 203.125,141.0625 L 203.125,140.5625 L 202.625,75.375 L 201.625,75.375 z "
+                 style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline"
+                 id="path3390" />
+              <path
+                 d="M 133.9993,141.3816 L 137.95166,137.33451 L 124,141.5 L 138.04638,145.33395 L 133.9993,141.3816 z "
+                 style="fill-rule:evenodd;stroke:#000000;stroke-width:0.8pt;marker-start:none"
+                 id="path2240" />
+            </g>
+            <g
+               id="g2226">
+              <path
+                 d="M 174.1875,75 L 174.0625,110.46875 L 124,111 L 124,112 L 174.5625,111.46875 L 175.0625,111.4375 L 175.0625,110.96875 L 175.1875,75 L 174.1875,75 z "
+                 style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline"
+                 id="path3392" />
+              <path
+                 d="M 133.99943,111.3928 L 137.95631,107.35014 L 124,111.5 L 138.04208,115.34968 L 133.99943,111.3928 z "
+                 style="fill-rule:evenodd;stroke:#000000;stroke-width:0.8pt;marker-start:none"
+                 id="path2232" />
+            </g>
+          </g>
+        </g>
+      </g>
+    </g>
+  </g>
+</svg>
diff --git a/_static/figures/Fichiers/fig/Little-Endian.svg b/_static/figures/Fichiers/fig/Little-Endian.svg
new file mode 100644
index 0000000000000000000000000000000000000000..c1545e495216a0ff661b4fc385360fa5f715e156
--- /dev/null
+++ b/_static/figures/Fichiers/fig/Little-Endian.svg
@@ -0,0 +1,358 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   version="1.0"
+   width="280"
+   height="250"
+   id="svg2328">
+  <defs
+     id="defs2330">
+    <marker
+       refX="0"
+       refY="0"
+       orient="auto"
+       style="overflow:visible"
+       id="Arrow1Lend">
+      <path
+         d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z "
+         transform="matrix(-0.8,0,0,-0.8,-10,0)"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         id="path3194" />
+    </marker>
+  </defs>
+  <g
+     id="layer1">
+    <g
+       transform="translate(-33,-16)"
+       id="g3480">
+      <g
+         transform="translate(-14.322004,-29)"
+         id="g3546">
+        <g
+           id="g3414">
+          <g
+             transform="translate(74.324543,139.79415)"
+             style="stroke:none"
+             id="g2177">
+            <path
+               d="M 194.97975,115.0099 L 194.97975,85.205848 L 224.99053,85.205848 L 224.99053,115.0099 L 194.97975,115.0099 z "
+               style="fill:#ffffff;stroke:none;stroke-width:0.42571709;overflow:visible"
+               id="path2179" />
+            <text
+               x="210.48268"
+               y="106.59099"
+               style="font-size:20px;font-style:normal;font-weight:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial Black"
+               id="text2181"
+               xml:space="preserve"><tspan
+                 x="210.48268"
+                 y="106.59099"
+                 style="font-size:18px;stroke:none"
+                 id="tspan2183">0A</tspan></text>
+          </g>
+          <g
+             transform="translate(74.324543,49.794155)"
+             style="stroke:none"
+             id="g3180">
+            <path
+               d="M 194.97975,115.0099 L 194.97975,85.205848 L 224.99053,85.205848 L 224.99053,115.0099 L 194.97975,115.0099 z "
+               style="fill:#ffffff;stroke:none;stroke-width:0.42571709;overflow:visible"
+               id="path3182" />
+            <text
+               x="210.48268"
+               y="106.59099"
+               style="font-size:20px;font-style:normal;font-weight:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial Black"
+               id="text3184"
+               xml:space="preserve"><tspan
+                 x="210.48268"
+                 y="106.59099"
+                 style="font-size:18px;stroke:none"
+                 id="tspan3186">0D</tspan></text>
+          </g>
+          <g
+             transform="translate(74.324543,79.794155)"
+             style="stroke:none"
+             id="g3188">
+            <path
+               d="M 194.97975,115.0099 L 194.97975,85.205848 L 224.99053,85.205848 L 224.99053,115.0099 L 194.97975,115.0099 z "
+               style="fill:#ffffff;stroke:none;stroke-width:0.42571709;overflow:visible"
+               id="path3190" />
+            <text
+               x="210.48268"
+               y="106.59099"
+               style="font-size:20px;font-style:normal;font-weight:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial Black"
+               id="text3192"
+               xml:space="preserve"><tspan
+                 x="210.48268"
+                 y="106.59099"
+                 style="font-size:18px;stroke:none"
+                 id="tspan3194">0C</tspan></text>
+          </g>
+          <g
+             transform="translate(74.324543,109.79415)"
+             style="stroke:none"
+             id="g3196">
+            <path
+               d="M 194.97975,115.0099 L 194.97975,85.205848 L 224.99053,85.205848 L 224.99053,115.0099 L 194.97975,115.0099 z "
+               style="fill:#ffffff;stroke:none;stroke-width:0.42571709;overflow:visible"
+               id="path3198" />
+            <text
+               x="210.48268"
+               y="106.59099"
+               style="font-size:20px;font-style:normal;font-weight:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial Black"
+               id="text3200"
+               xml:space="preserve"><tspan
+                 x="210.48268"
+                 y="106.59099"
+                 style="font-size:18px;stroke:none"
+                 id="tspan3202">0B</tspan></text>
+          </g>
+          <path
+             d="M 269.57222,255.25715 L 299.05792,255.42779"
+             style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.51429158;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+             id="path2185" />
+          <path
+             d="M 269.68311,120.31689 L 269.63196,269.68311"
+             style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.6337797;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+             id="path3158" />
+          <path
+             d="M 299.68311,120.31689 L 299.63195,269.68311"
+             style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.63377368;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+             id="path3168" />
+          <path
+             d="M 269.57222,225.25715 L 299.05792,225.42779"
+             style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.51429158;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+             id="path3170" />
+          <path
+             d="M 269.57222,194.57221 L 299.05792,194.74285"
+             style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.51429158;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+             id="path3172" />
+          <path
+             d="M 269.57222,165.25715 L 299.05792,165.42779"
+             style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.51429158;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+             id="path3174" />
+          <path
+             d="M 269.57222,135.25715 L 299.05792,135.42779"
+             style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.51429158;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+             id="path3178" />
+          <g
+             transform="translate(63.764862,76.892123)"
+             style="stroke:none"
+             id="g3204">
+            <text
+               x="49.333466"
+               y="-219.84514"
+               transform="matrix(0,1,-1,0,0,0)"
+               style="font-size:20px;font-style:normal;font-weight:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial Black"
+               id="text3208"
+               xml:space="preserve"><tspan
+                 x="49.333466"
+                 y="-219.84514"
+                 style="font-size:18px;stroke:none;font-family:Times New Roman"
+                 id="tspan3210">...</tspan></text>
+            <text
+               x="187.58347"
+               y="-219.84514"
+               transform="matrix(0,1,-1,0,0,0)"
+               style="font-size:20px;font-style:normal;font-weight:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial Black"
+               id="text3212"
+               xml:space="preserve"><tspan
+                 x="187.58347"
+                 y="-219.84514"
+                 style="font-size:18px;stroke:none;font-family:Times New Roman"
+                 id="tspan3214">...</tspan></text>
+            <g
+               transform="translate(69.065073,85.25)"
+               style="stroke:none;stroke-opacity:1"
+               id="g3279">
+              <rect
+                 width="40"
+                 height="25"
+                 x="96.485138"
+                 y="67.85788"
+                 style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+                 id="rect3281" />
+              <text
+                 x="133.96561"
+                 y="82.861786"
+                 style="font-size:18px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
+                 id="text3283"
+                 xml:space="preserve"><tspan
+                   x="133.96561"
+                   y="82.861786"
+                   style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:end;line-height:125%;writing-mode:lr-tb;text-anchor:end;stroke:none;stroke-opacity:1;font-family:Times New Roman"
+                   id="tspan3285"><tspan
+   style="font-size:18px;font-style:italic;text-align:end;text-anchor:end;stroke:none;stroke-opacity:1"
+   id="tspan3287">a</tspan>+3:</tspan></text>
+            </g>
+            <g
+               transform="translate(69.065073,55.25)"
+               style="stroke:none;stroke-opacity:1"
+               id="g3309">
+              <rect
+                 width="40"
+                 height="25"
+                 x="96.485138"
+                 y="67.85788"
+                 style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+                 id="rect3311" />
+              <text
+                 x="133.96561"
+                 y="82.861786"
+                 style="font-size:18px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
+                 id="text3313"
+                 xml:space="preserve"><tspan
+                   x="133.96561"
+                   y="82.861786"
+                   style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:end;line-height:125%;writing-mode:lr-tb;text-anchor:end;stroke:none;stroke-opacity:1;font-family:Times New Roman"
+                   id="tspan3315"><tspan
+   style="font-size:18px;font-style:italic;text-align:end;text-anchor:end;stroke:none;stroke-opacity:1"
+   id="tspan3317">a</tspan>+2:</tspan></text>
+            </g>
+            <g
+               transform="translate(69.065073,25.25)"
+               style="stroke:none;stroke-opacity:1"
+               id="g3319">
+              <rect
+                 width="40"
+                 height="25"
+                 x="96.485138"
+                 y="67.85788"
+                 style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+                 id="rect3321" />
+              <text
+                 x="133.96561"
+                 y="82.861786"
+                 style="font-size:18px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
+                 id="text3323"
+                 xml:space="preserve"><tspan
+                   x="133.96561"
+                   y="82.861786"
+                   style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:end;line-height:125%;writing-mode:lr-tb;text-anchor:end;stroke:none;stroke-opacity:1;font-family:Times New Roman"
+                   id="tspan3325"><tspan
+   style="font-size:18px;font-style:italic;text-align:end;text-anchor:end;stroke:none;stroke-opacity:1"
+   id="tspan3327">a</tspan>+1:</tspan></text>
+            </g>
+            <g
+               transform="translate(69.065073,-4.7500002)"
+               style="stroke:none;stroke-opacity:1"
+               id="g3329">
+              <rect
+                 width="40"
+                 height="25"
+                 x="96.485138"
+                 y="67.85788"
+                 style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+                 id="rect3331" />
+              <text
+                 x="133.96561"
+                 y="82.861786"
+                 style="font-size:18px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
+                 id="text3333"
+                 xml:space="preserve"><tspan
+                   x="133.96561"
+                   y="82.861786"
+                   style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:end;line-height:125%;writing-mode:lr-tb;text-anchor:end;stroke:none;stroke-opacity:1;font-family:Times New Roman"
+                   id="tspan3335"><tspan
+   style="font-size:18px;font-style:italic;text-align:end;text-anchor:end;stroke:none;stroke-opacity:1"
+   id="tspan3337">a</tspan>:</tspan></text>
+            </g>
+          </g>
+          <text
+             x="282.54688"
+             y="105.59375"
+             style="font-size:16px;font-style:normal;font-weight:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
+             id="text3347"
+             xml:space="preserve"><tspan
+               x="282.54688"
+               y="105.59375"
+               id="tspan3349">Memory</tspan></text>
+        </g>
+        <g
+           id="g3466">
+          <g
+             transform="translate(33.661004,43.779998)"
+             id="g2363">
+            <path
+               d="M 34.109876,69.331124 L 34.109876,36.668878 L 155.89012,36.668878 L 155.89012,69.331124 L 34.109876,69.331124 z "
+               style="fill:#ffffff;stroke:#000000;stroke-width:0.89775217;overflow:visible"
+               id="path2340" />
+            <text
+               x="95"
+               y="60"
+               style="font-size:16px;font-style:normal;font-weight:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial Black"
+               id="text2359"
+               xml:space="preserve"><tspan
+                 x="95"
+                 y="60"
+                 style="font-size:20px"
+                 id="tspan2361">0A0B0C0D</tspan></text>
+          </g>
+          <text
+             x="128.25781"
+             y="71.109375"
+             style="font-size:16px;font-style:normal;font-weight:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
+             id="text3343"
+             xml:space="preserve"><tspan
+               x="128.25781"
+               y="71.109375"
+               id="tspan3345">Register</tspan></text>
+          <text
+             x="143.77344"
+             y="266.10938"
+             style="font-size:16px;font-style:normal;font-weight:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
+             id="text3351"
+             xml:space="preserve"><tspan
+               x="143.77344"
+               y="266.10938"
+               id="tspan3353">Little-endian</tspan></text>
+          <g
+             id="g2225">
+            <path
+               d="M 170.03125,113.09375 L 170.0625,148.5 L 170.0625,149 L 170.5625,149 L 224.46875,149.875 L 224.5,148.84375 L 171.09375,147.96875 L 171.0625,113.09375 L 170.03125,113.09375 z "
+               style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.02955723px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline"
+               id="path2215" />
+            <path
+               d="M 214.19102,149.19681 L 210.00613,153.24728 L 224.48522,149.36483 L 210.14055,145.01192 L 214.19102,149.19681 z "
+               style="fill-rule:evenodd;stroke:#000000;stroke-width:0.82364578pt;marker-start:none"
+               id="path2231" />
+          </g>
+          <g
+             id="g2233">
+            <path
+               d="M 142,113 L 142.15625,177.9375 L 142.15625,178.4375 L 142.65625,178.4375 L 224.5,178.5 L 224.5,177.5 L 143.15625,177.4375 L 143,113 L 142,113 z "
+               style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline"
+               id="path3388" />
+            <path
+               d="M 214.5,177.99336 L 210.49735,181.9907 L 224.5,178 L 210.50266,173.9907 L 214.5,177.99336 z "
+               style="fill-rule:evenodd;stroke:#000000;stroke-width:0.8pt;marker-start:none"
+               id="path2239" />
+          </g>
+          <g
+             id="g2241">
+            <path
+               d="M 110.9375,113.375 L 110.375,209.6875 L 110.375,210.1875 L 110.875,210.1875 L 225,210.5 L 225,209.5 L 111.375,209.1875 L 111.9375,113.375 L 110.9375,113.375 z "
+               style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline"
+               id="path3390" />
+            <path
+               d="M 215.00004,209.97211 L 210.9889,213.96094 L 225,210 L 211.01121,205.96097 L 215.00004,209.97211 z "
+               style="fill-rule:evenodd;stroke:#000000;stroke-width:0.8pt;marker-start:none"
+               id="path2247" />
+          </g>
+          <g
+             id="g2249">
+            <path
+               d="M 83.5,113 L 83.4375,238.5 L 83.4375,239 L 83.9375,239 L 224,239 L 224,238 L 84.4375,238 L 84.5,113 L 83.5,113 z "
+               style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline"
+               id="path3392" />
+            <path
+               d="M 214,238.50057 L 210.00023,242.50079 L 224,238.5 L 209.99977,234.50079 L 214,238.50057 z "
+               style="fill-rule:evenodd;stroke:#000000;stroke-width:0.8pt;marker-start:none"
+               id="path2255" />
+          </g>
+        </g>
+      </g>
+    </g>
+  </g>
+</svg>
diff --git a/_static/figures/Fichiers/fig/figures-10-001-c.png b/_static/figures/Fichiers/fig/figures-10-001-c.png
new file mode 100644
index 0000000000000000000000000000000000000000..9e5c34af533251ddaa62607703df2a6a205250ff
Binary files /dev/null and b/_static/figures/Fichiers/fig/figures-10-001-c.png differ
diff --git a/_static/figures/Fichiers/fig/figures-10-002-c.png b/_static/figures/Fichiers/fig/figures-10-002-c.png
new file mode 100644
index 0000000000000000000000000000000000000000..e4250eb104667bc17bc606c468e17b88273b7748
Binary files /dev/null and b/_static/figures/Fichiers/fig/figures-10-002-c.png differ
diff --git a/_static/figures/Fichiers/fig/figures-10-003-c.png b/_static/figures/Fichiers/fig/figures-10-003-c.png
new file mode 100644
index 0000000000000000000000000000000000000000..30ca2f50203600c3b68a0af8a37c8f6bc041b39a
Binary files /dev/null and b/_static/figures/Fichiers/fig/figures-10-003-c.png differ
diff --git a/_static/figures/Fichiers/fig/figures-10-004-c.png b/_static/figures/Fichiers/fig/figures-10-004-c.png
new file mode 100644
index 0000000000000000000000000000000000000000..3a0c96f5da66cc39d56f99530d164391ac81ca34
Binary files /dev/null and b/_static/figures/Fichiers/fig/figures-10-004-c.png differ
diff --git a/_static/figures/Fichiers/fig/figures-10.001.png b/_static/figures/Fichiers/fig/figures-10.001.png
new file mode 100644
index 0000000000000000000000000000000000000000..c9e922bfbddb81f604ddb5b87fb91aa7087fb2b2
Binary files /dev/null and b/_static/figures/Fichiers/fig/figures-10.001.png differ
diff --git a/_static/figures/Fichiers/fig/figures-10.002.png b/_static/figures/Fichiers/fig/figures-10.002.png
new file mode 100644
index 0000000000000000000000000000000000000000..2a92c9bb3bbcfcdf6fb54c2f906d1ddf4f50afc5
Binary files /dev/null and b/_static/figures/Fichiers/fig/figures-10.002.png differ
diff --git a/_static/figures/Fichiers/fig/figures-10.003.png b/_static/figures/Fichiers/fig/figures-10.003.png
new file mode 100644
index 0000000000000000000000000000000000000000..f516ac03cb5e5c7e29dec1b04124962eb17f1b57
Binary files /dev/null and b/_static/figures/Fichiers/fig/figures-10.003.png differ
diff --git a/_static/figures/Fichiers/fig/figures-10.004.png b/_static/figures/Fichiers/fig/figures-10.004.png
new file mode 100644
index 0000000000000000000000000000000000000000..adce61b49d0e919c7d038b3561b113b62a6147f5
Binary files /dev/null and b/_static/figures/Fichiers/fig/figures-10.004.png differ
diff --git a/_static/figures/Threads/S5-src/errno.c b/_static/figures/Threads/S5-src/errno.c
new file mode 100644
index 0000000000000000000000000000000000000000..4c0a4ec790bb622f03dfdb9a0714063f065c1950
--- /dev/null
+++ b/_static/figures/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/figures/Threads/S5-src/fctptr.c b/_static/figures/Threads/S5-src/fctptr.c
new file mode 100644
index 0000000000000000000000000000000000000000..c9b68d53b0d4231dd3e6f9348b13263c5ed3c031
--- /dev/null
+++ b/_static/figures/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/figures/Threads/S5-src/main.c b/_static/figures/Threads/S5-src/main.c
new file mode 100644
index 0000000000000000000000000000000000000000..01130f8a563511b4851a98873a0e95f937025024
--- /dev/null
+++ b/_static/figures/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/figures/Threads/S5-src/math.c b/_static/figures/Threads/S5-src/math.c
new file mode 100644
index 0000000000000000000000000000000000000000..78da61797c921410ef305fbe67fd8ab747284f77
--- /dev/null
+++ b/_static/figures/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/figures/Threads/S5-src/min-ex.c b/_static/figures/Threads/S5-src/min-ex.c
new file mode 100644
index 0000000000000000000000000000000000000000..44712f5ae995c912657d9cf3b4b9cfb253f95a85
--- /dev/null
+++ b/_static/figures/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/figures/Threads/S5-src/min.c b/_static/figures/Threads/S5-src/min.c
new file mode 100644
index 0000000000000000000000000000000000000000..1a0c53f81b43a18e0c0be95f386570b256c0cfef
--- /dev/null
+++ b/_static/figures/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/figures/Threads/S5-src/module.c b/_static/figures/Threads/S5-src/module.c
new file mode 100644
index 0000000000000000000000000000000000000000..a8f6204ae63f555734b0d31f3fd6285b5915bad7
--- /dev/null
+++ b/_static/figures/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/figures/Threads/S5-src/mystrtol.c b/_static/figures/Threads/S5-src/mystrtol.c
new file mode 100644
index 0000000000000000000000000000000000000000..3cfbfdc267ac23810a787a128d3110798f254138
--- /dev/null
+++ b/_static/figures/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/figures/Threads/S5-src/prog.c b/_static/figures/Threads/S5-src/prog.c
new file mode 100644
index 0000000000000000000000000000000000000000..538d4f8a4b0aa521664f00e9169d11dd8fa3556d
--- /dev/null
+++ b/_static/figures/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/figures/Threads/S5-src/pthread-args.c b/_static/figures/Threads/S5-src/pthread-args.c
new file mode 100644
index 0000000000000000000000000000000000000000..6e4365501388aba19b8adbb30d4743524b46f371
--- /dev/null
+++ b/_static/figures/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/figures/Threads/S5-src/pthread-array.c b/_static/figures/Threads/S5-src/pthread-array.c
new file mode 100644
index 0000000000000000000000000000000000000000..242a3209a44a8f4d319bd166af38d42542d38909
--- /dev/null
+++ b/_static/figures/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/figures/Threads/S5-src/pthread-neg.c b/_static/figures/Threads/S5-src/pthread-neg.c
new file mode 100644
index 0000000000000000000000000000000000000000..efc0b74ff6bddae9c8d8169aaed7cccfece1edd0
--- /dev/null
+++ b/_static/figures/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/figures/Threads/S5-src/pthread-neg2.c b/_static/figures/Threads/S5-src/pthread-neg2.c
new file mode 100644
index 0000000000000000000000000000000000000000..15573be985fee78fd349496be1f4d64bab2dbe80
--- /dev/null
+++ b/_static/figures/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/figures/Threads/S5-src/pthread-test-if.c b/_static/figures/Threads/S5-src/pthread-test-if.c
new file mode 100644
index 0000000000000000000000000000000000000000..d901ebe3b4cad95a5bbc61b2ba923305a4f0b148
--- /dev/null
+++ b/_static/figures/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/figures/Threads/S5-src/pthread-test.c b/_static/figures/Threads/S5-src/pthread-test.c
new file mode 100644
index 0000000000000000000000000000000000000000..0cfb277d9aa349afd6f0f8bf5dc9ec74bdab10d8
--- /dev/null
+++ b/_static/figures/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/figures/Threads/S5-src/pthread.c b/_static/figures/Threads/S5-src/pthread.c
new file mode 100644
index 0000000000000000000000000000000000000000..4e2741c68832e16f565b1305d5ce5e05f617564b
--- /dev/null
+++ b/_static/figures/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/figures/Threads/S5-src/ptr-char.c b/_static/figures/Threads/S5-src/ptr-char.c
new file mode 100644
index 0000000000000000000000000000000000000000..4af3385ff319c996f6ed3879c11b1f8f65e8288c
--- /dev/null
+++ b/_static/figures/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/figures/Threads/S5-src/ptr.c b/_static/figures/Threads/S5-src/ptr.c
new file mode 100644
index 0000000000000000000000000000000000000000..c4ddc482ae1c7be7d615c7456f622e44dbf05559
--- /dev/null
+++ b/_static/figures/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/figures/Threads/S5-src/ptrptr.c b/_static/figures/Threads/S5-src/ptrptr.c
new file mode 100644
index 0000000000000000000000000000000000000000..1044c2a914f7f8902b5257fd951ec34e529fbdd3
--- /dev/null
+++ b/_static/figures/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/figures/Threads/S5-src/qsort.c b/_static/figures/Threads/S5-src/qsort.c
new file mode 100644
index 0000000000000000000000000000000000000000..3e834bba35d90ebcebafc19a92e954a0e72d5723
--- /dev/null
+++ b/_static/figures/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/figures/Threads/S5-src/strip.c b/_static/figures/Threads/S5-src/strip.c
new file mode 100644
index 0000000000000000000000000000000000000000..238480980fb8277719d9ea2576bb3633d01aff8e
--- /dev/null
+++ b/_static/figures/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/figures/Threads/S5-src/strsep.c b/_static/figures/Threads/S5-src/strsep.c
new file mode 100644
index 0000000000000000000000000000000000000000..a523cd67169889939873f47a484dc0f4f8f64f76
--- /dev/null
+++ b/_static/figures/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/figures/Threads/S5-src/strtol.c b/_static/figures/Threads/S5-src/strtol.c
new file mode 100644
index 0000000000000000000000000000000000000000..b1755d6fa8bdd9d8dea44720458583bbe5539441
--- /dev/null
+++ b/_static/figures/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/figures/Threads/S5-src/sudoku.c b/_static/figures/Threads/S5-src/sudoku.c
new file mode 100644
index 0000000000000000000000000000000000000000..215e3e4e4857e09d450ceedcf2efc6765b16e5d6
--- /dev/null
+++ b/_static/figures/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/figures/Threads/S6-fig/figures-001-c.png b/_static/figures/Threads/S6-fig/figures-001-c.png
new file mode 100644
index 0000000000000000000000000000000000000000..48c5aa499b47647fd9ccb59496550b0f40d8f800
Binary files /dev/null and b/_static/figures/Threads/S6-fig/figures-001-c.png differ
diff --git a/_static/figures/Threads/S6-fig/figures-002-c.png b/_static/figures/Threads/S6-fig/figures-002-c.png
new file mode 100644
index 0000000000000000000000000000000000000000..5d1267967d4acc5fd956cb4cece893c0da64518a
Binary files /dev/null and b/_static/figures/Threads/S6-fig/figures-002-c.png differ
diff --git a/_static/figures/Threads/S6-fig/figures-003-c.png b/_static/figures/Threads/S6-fig/figures-003-c.png
new file mode 100644
index 0000000000000000000000000000000000000000..7cdc9d1c9bd0d7d6fd0498754a655a427d51190b
Binary files /dev/null and b/_static/figures/Threads/S6-fig/figures-003-c.png differ
diff --git a/_static/figures/Threads/S6-fig/figures.001.png b/_static/figures/Threads/S6-fig/figures.001.png
new file mode 100644
index 0000000000000000000000000000000000000000..0205872366cac8d88947e84333f4f8bd7efdce36
Binary files /dev/null and b/_static/figures/Threads/S6-fig/figures.001.png differ
diff --git a/_static/figures/Threads/S6-fig/figures.002.png b/_static/figures/Threads/S6-fig/figures.002.png
new file mode 100644
index 0000000000000000000000000000000000000000..37d158236c459e9056cf020760120c6939bdcf6f
Binary files /dev/null and b/_static/figures/Threads/S6-fig/figures.002.png differ
diff --git a/_static/figures/Threads/S6-fig/figures.003.png b/_static/figures/Threads/S6-fig/figures.003.png
new file mode 100644
index 0000000000000000000000000000000000000000..577900fb56fe8884027f5c98c054993f60a4c217
Binary files /dev/null and b/_static/figures/Threads/S6-fig/figures.003.png differ
diff --git a/_static/figures/Threads/S6-src/Makefile b/_static/figures/Threads/S6-src/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..2aa4fb2bec558ba3a7ce233ec09acd46ad48165f
--- /dev/null
+++ b/_static/figures/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/figures/Threads/S6-src/arraylist.c b/_static/figures/Threads/S6-src/arraylist.c
new file mode 100644
index 0000000000000000000000000000000000000000..406b7a1d8322bf033f0bb8d33d1ef48b6b65ac13
--- /dev/null
+++ b/_static/figures/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/figures/Threads/S6-src/arraylist2.c b/_static/figures/Threads/S6-src/arraylist2.c
new file mode 100644
index 0000000000000000000000000000000000000000..07ad5d48bf820f56ba3a926e92153dd15d2b2b5d
--- /dev/null
+++ b/_static/figures/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/figures/Threads/S6-src/pthread-mutex-perf.c b/_static/figures/Threads/S6-src/pthread-mutex-perf.c
new file mode 100644
index 0000000000000000000000000000000000000000..63eab9f09c8cc776794aa0309a4f483c1ca57720
--- /dev/null
+++ b/_static/figures/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/figures/Threads/S6-src/pthread-mutex.c b/_static/figures/Threads/S6-src/pthread-mutex.c
new file mode 100644
index 0000000000000000000000000000000000000000..891d1cf91baf1c29fe8e001b2419febe1a3bc673
--- /dev/null
+++ b/_static/figures/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/figures/Threads/S6-src/pthread-mutex.out b/_static/figures/Threads/S6-src/pthread-mutex.out
new file mode 100644
index 0000000000000000000000000000000000000000..f9d92b29b14dfabfaf0ba54735e13a1abc82cd82
--- /dev/null
+++ b/_static/figures/Threads/S6-src/pthread-mutex.out
@@ -0,0 +1 @@
+global: 4000000
diff --git a/_static/figures/Threads/S6-src/pthread-neg2.c b/_static/figures/Threads/S6-src/pthread-neg2.c
new file mode 100644
index 0000000000000000000000000000000000000000..efc0b74ff6bddae9c8d8169aaed7cccfece1edd0
--- /dev/null
+++ b/_static/figures/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/figures/Threads/S6-src/pthread-neg2.out b/_static/figures/Threads/S6-src/pthread-neg2.out
new file mode 100644
index 0000000000000000000000000000000000000000..d5823dd8ef29e10d55c1c0b0085387ce326e5d98
--- /dev/null
+++ b/_static/figures/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/figures/Threads/S6-src/pthread-philo.c b/_static/figures/Threads/S6-src/pthread-philo.c
new file mode 100644
index 0000000000000000000000000000000000000000..33d63c137ecf32e6359464660adb269648fdfb91
--- /dev/null
+++ b/_static/figures/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/figures/Threads/S6-src/pthread-philo2.c b/_static/figures/Threads/S6-src/pthread-philo2.c
new file mode 100644
index 0000000000000000000000000000000000000000..1e4113b83c358a1e84571aa1ce5f792a9bc1d504
--- /dev/null
+++ b/_static/figures/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/figures/Threads/S6-src/pthread-spin.c b/_static/figures/Threads/S6-src/pthread-spin.c
new file mode 100644
index 0000000000000000000000000000000000000000..b4839da01400e690dfea38acab2bc7f8447fd916
--- /dev/null
+++ b/_static/figures/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/figures/Threads/S6-src/pthread-test-if.c b/_static/figures/Threads/S6-src/pthread-test-if.c
new file mode 100644
index 0000000000000000000000000000000000000000..f3fa8e26e7d22850e8fdeb06f5b9725a6f8d7a81
--- /dev/null
+++ b/_static/figures/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/figures/Threads/S6-src/pthread.c b/_static/figures/Threads/S6-src/pthread.c
new file mode 100644
index 0000000000000000000000000000000000000000..9f781d0c1025d8cf28ee58734a6dc903fa44fd32
--- /dev/null
+++ b/_static/figures/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/figures/Threads/S6-src/thread_crash.c b/_static/figures/Threads/S6-src/thread_crash.c
new file mode 100644
index 0000000000000000000000000000000000000000..b9f34e91dea12772b85582bcec89d1589a73245c
--- /dev/null
+++ b/_static/figures/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/figures/Threads/S7-src/Makefile b/_static/figures/Threads/S7-src/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..7a5a1577fe951aeab09924492e8d2e02b4a8efc8
--- /dev/null
+++ b/_static/figures/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/figures/Threads/S7-src/pthread-barrier.c b/_static/figures/Threads/S7-src/pthread-barrier.c
new file mode 100644
index 0000000000000000000000000000000000000000..02033916baf1f9d687c07e963a78c77d0c7faf08
--- /dev/null
+++ b/_static/figures/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/figures/Threads/S7-src/pthread-id.c b/_static/figures/Threads/S7-src/pthread-id.c
new file mode 100644
index 0000000000000000000000000000000000000000..e72193fcd9e29cbc5a7c62ee9fb57bb68f75f3cf
--- /dev/null
+++ b/_static/figures/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/figures/Threads/S7-src/pthread-philo-sem.c b/_static/figures/Threads/S7-src/pthread-philo-sem.c
new file mode 100644
index 0000000000000000000000000000000000000000..8d27d804b61277834c87a0cbc9d095413a8076a8
--- /dev/null
+++ b/_static/figures/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/figures/Threads/S7-src/pthread-rw.c b/_static/figures/Threads/S7-src/pthread-rw.c
new file mode 100644
index 0000000000000000000000000000000000000000..22ab9328c59805f43bba9f2804d8edbf3f295143
--- /dev/null
+++ b/_static/figures/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/figures/Threads/S7-src/pthread-sem-before.c b/_static/figures/Threads/S7-src/pthread-sem-before.c
new file mode 100644
index 0000000000000000000000000000000000000000..fd4567586f1ccd5c72a0b7e29848e960b898c6d9
--- /dev/null
+++ b/_static/figures/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/figures/Threads/S7-src/pthread-sem-before.out b/_static/figures/Threads/S7-src/pthread-sem-before.out
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/_static/figures/Threads/S7-src/pthread-sem.c b/_static/figures/Threads/S7-src/pthread-sem.c
new file mode 100644
index 0000000000000000000000000000000000000000..28890557548e5cdba7a052918cd5febf8c4fbe57
--- /dev/null
+++ b/_static/figures/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/figures/Threads/S7-src/pthread-sem.out b/_static/figures/Threads/S7-src/pthread-sem.out
new file mode 100644
index 0000000000000000000000000000000000000000..cb6ea05e0fe7b70523a0556e88ea20481eb28b72
--- /dev/null
+++ b/_static/figures/Threads/S7-src/pthread-sem.out
@@ -0,0 +1 @@
+global: 3837069
diff --git a/_static/figures/Threads/S7-src/pthread-specific.c b/_static/figures/Threads/S7-src/pthread-specific.c
new file mode 100644
index 0000000000000000000000000000000000000000..38a347a126aa561951e49e6e782aa2a41eb8dd55
--- /dev/null
+++ b/_static/figures/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/figures/Threads/S7-src/pthread-specific.out b/_static/figures/Threads/S7-src/pthread-specific.out
new file mode 100644
index 0000000000000000000000000000000000000000..f0eb4d4432d5c6cd658ac2ff16f2487c2334216f
--- /dev/null
+++ b/_static/figures/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/figures/Threads/S7-src/pthread-specific2.c b/_static/figures/Threads/S7-src/pthread-specific2.c
new file mode 100644
index 0000000000000000000000000000000000000000..47cec0223ad8ae4f692c67f61fc754d46c731cfa
--- /dev/null
+++ b/_static/figures/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/figures/Threads/S7-src/pthread-specific2.out b/_static/figures/Threads/S7-src/pthread-specific2.out
new file mode 100644
index 0000000000000000000000000000000000000000..c717fae88a16bed9a2e7040da20f76e80ee5e0be
--- /dev/null
+++ b/_static/figures/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/figures/Threads/S7-src/reentrant.c b/_static/figures/Threads/S7-src/reentrant.c
new file mode 100644
index 0000000000000000000000000000000000000000..89743445840f46c42dd7ec9331d6843bec7f5630
--- /dev/null
+++ b/_static/figures/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/figures/Threads/S7-src/strerror.c b/_static/figures/Threads/S7-src/strerror.c
new file mode 100644
index 0000000000000000000000000000000000000000..a1571c52fdea21e2ad2003a79ccaa430417a4ed0
--- /dev/null
+++ b/_static/figures/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/figures/Threads/S8-src/Makefile b/_static/figures/Threads/S8-src/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..7a5a1577fe951aeab09924492e8d2e02b4a8efc8
--- /dev/null
+++ b/_static/figures/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/figures/Threads/S8-src/Makefile-lib b/_static/figures/Threads/S8-src/Makefile-lib
new file mode 100644
index 0000000000000000000000000000000000000000..6cbf869aa0354706af10c9a5ddd0b3bb98e9ab15
--- /dev/null
+++ b/_static/figures/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/figures/Threads/S8-src/atexit.c b/_static/figures/Threads/S8-src/atexit.c
new file mode 100644
index 0000000000000000000000000000000000000000..deb7367e8301e57e585a929ad7c0e54a913b92b6
--- /dev/null
+++ b/_static/figures/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/figures/Threads/S8-src/execve-long.c b/_static/figures/Threads/S8-src/execve-long.c
new file mode 100644
index 0000000000000000000000000000000000000000..0b5e7916dd31dee8385f92d3db6df24818c8c01e
--- /dev/null
+++ b/_static/figures/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/figures/Threads/S8-src/execve.c b/_static/figures/Threads/S8-src/execve.c
new file mode 100644
index 0000000000000000000000000000000000000000..64367f79f0b8db5996b6b5a25a57b04206b62a7c
--- /dev/null
+++ b/_static/figures/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/figures/Threads/S8-src/execve.out b/_static/figures/Threads/S8-src/execve.out
new file mode 100644
index 0000000000000000000000000000000000000000..00750edc07d6415dcc07ae0351e9397b0222b7ba
--- /dev/null
+++ b/_static/figures/Threads/S8-src/execve.out
@@ -0,0 +1 @@
+3
diff --git a/_static/figures/Threads/S8-src/fork-buf.c b/_static/figures/Threads/S8-src/fork-buf.c
new file mode 100644
index 0000000000000000000000000000000000000000..718004df8a0181b578017599dee900be7c67bd8f
--- /dev/null
+++ b/_static/figures/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/figures/Threads/S8-src/fork-execve.c b/_static/figures/Threads/S8-src/fork-execve.c
new file mode 100644
index 0000000000000000000000000000000000000000..52e771c15271001b8c48b511236e847bb3b1c231
--- /dev/null
+++ b/_static/figures/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/figures/Threads/S8-src/fork-manyexec.c b/_static/figures/Threads/S8-src/fork-manyexec.c
new file mode 100644
index 0000000000000000000000000000000000000000..b0742d45b66bd85e56c17d3626626e3db0cbf431
--- /dev/null
+++ b/_static/figures/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/figures/Threads/S8-src/fork-manyexec.out b/_static/figures/Threads/S8-src/fork-manyexec.out
new file mode 100644
index 0000000000000000000000000000000000000000..942f0cdf2a69fa0ddd52340e28f0feb9392b0884
--- /dev/null
+++ b/_static/figures/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/figures/Threads/S8-src/fork-nice.c b/_static/figures/Threads/S8-src/fork-nice.c
new file mode 100644
index 0000000000000000000000000000000000000000..e746a7d109259baf9e316f8fbff860c1dff12229
--- /dev/null
+++ b/_static/figures/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/figures/Threads/S8-src/fork-orphan.c b/_static/figures/Threads/S8-src/fork-orphan.c
new file mode 100644
index 0000000000000000000000000000000000000000..751d5a123d9035862047b6308b1fc894eaef63af
--- /dev/null
+++ b/_static/figures/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/figures/Threads/S8-src/fork-orphan.out b/_static/figures/Threads/S8-src/fork-orphan.out
new file mode 100644
index 0000000000000000000000000000000000000000..6f5395e9eb46edac55b814bb46d43ca9149d7990
--- /dev/null
+++ b/_static/figures/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/figures/Threads/S8-src/fork-perf.c b/_static/figures/Threads/S8-src/fork-perf.c
new file mode 100644
index 0000000000000000000000000000000000000000..3c330d9569d6b947e69c2f0c557656898257f01b
--- /dev/null
+++ b/_static/figures/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/figures/Threads/S8-src/fork-pthread.c b/_static/figures/Threads/S8-src/fork-pthread.c
new file mode 100644
index 0000000000000000000000000000000000000000..ebb9b6d6bd6e9580d7942c92af6167ba8d2a993b
--- /dev/null
+++ b/_static/figures/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/figures/Threads/S8-src/fork-wait.c b/_static/figures/Threads/S8-src/fork-wait.c
new file mode 100644
index 0000000000000000000000000000000000000000..9d8fa3b903351bc0344b3a42bfc385eadb836675
--- /dev/null
+++ b/_static/figures/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/figures/Threads/S8-src/fork-zombie.c b/_static/figures/Threads/S8-src/fork-zombie.c
new file mode 100644
index 0000000000000000000000000000000000000000..33959bf53a1bbcd70d980bd9fae5164fe48115d9
--- /dev/null
+++ b/_static/figures/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/figures/Threads/S8-src/fork.c b/_static/figures/Threads/S8-src/fork.c
new file mode 100644
index 0000000000000000000000000000000000000000..6cd78db0a9484b656e6b9710fc6ca1363bbe5165
--- /dev/null
+++ b/_static/figures/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/figures/Threads/S8-src/fork.out b/_static/figures/Threads/S8-src/fork.out
new file mode 100644
index 0000000000000000000000000000000000000000..1f71b8911b5f970a3e0012f03e3c4e800553bfbe
--- /dev/null
+++ b/_static/figures/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/figures/Threads/S8-src/getpid.c b/_static/figures/Threads/S8-src/getpid.c
new file mode 100644
index 0000000000000000000000000000000000000000..fddef731a947678c8a615b3bbfdddec52e9ea461
--- /dev/null
+++ b/_static/figures/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/figures/Threads/S8-src/imath.c b/_static/figures/Threads/S8-src/imath.c
new file mode 100644
index 0000000000000000000000000000000000000000..3c2887a56e3763f57e5237fa94ab07081d4f2a3f
--- /dev/null
+++ b/_static/figures/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/figures/Threads/S8-src/imax.c b/_static/figures/Threads/S8-src/imax.c
new file mode 100644
index 0000000000000000000000000000000000000000..92b80fee674638cbf2c7ae9a52c0c1dbe7d5c4a7
--- /dev/null
+++ b/_static/figures/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/figures/Threads/S8-src/imax.h b/_static/figures/Threads/S8-src/imax.h
new file mode 100644
index 0000000000000000000000000000000000000000..444fb1ab002477eecfb88e226b1a2ae23436d657
--- /dev/null
+++ b/_static/figures/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/figures/Threads/S8-src/math.c b/_static/figures/Threads/S8-src/math.c
new file mode 100644
index 0000000000000000000000000000000000000000..55e23123df634f6f0c075ecc23521a711731f397
--- /dev/null
+++ b/_static/figures/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/figures/Threads/S8-src/max.c b/_static/figures/Threads/S8-src/max.c
new file mode 100644
index 0000000000000000000000000000000000000000..bab26965fb534d534034116f03af788642d01b79
--- /dev/null
+++ b/_static/figures/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/figures/Threads/S8-src/mini8.c b/_static/figures/Threads/S8-src/mini8.c
new file mode 100644
index 0000000000000000000000000000000000000000..b69b1aefa12db155a77c248310b4078af838fcd1
--- /dev/null
+++ b/_static/figures/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/figures/Threads/S8-src/pthread-perf.c b/_static/figures/Threads/S8-src/pthread-perf.c
new file mode 100644
index 0000000000000000000000000000000000000000..07772a2c21ab37b146401686b55c6945b23ba375
--- /dev/null
+++ b/_static/figures/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/figures/Threads/S8-src/script.sh b/_static/figures/Threads/S8-src/script.sh
new file mode 100755
index 0000000000000000000000000000000000000000..cfd6015e4989e6a37c97c0b8950c868f98b35761
--- /dev/null
+++ b/_static/figures/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/figures/Threads/S8-src/syscall.c b/_static/figures/Threads/S8-src/syscall.c
new file mode 100644
index 0000000000000000000000000000000000000000..f102291addc712aefd597e9599441b81d9832c60
--- /dev/null
+++ b/_static/figures/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/figures/Threads/S8-src/test.tail b/_static/figures/Threads/S8-src/test.tail
new file mode 100755
index 0000000000000000000000000000000000000000..242953177ecd4d6f101fe13221388c466b0081bf
--- /dev/null
+++ b/_static/figures/Threads/S8-src/test.tail
@@ -0,0 +1,3 @@
+#!/usr/bin/tail -n +1
+Hello, world
+SINF1252
diff --git a/_static/figures/Threads/figures/188px-Matrix_multiplication_diagram.png b/_static/figures/Threads/figures/188px-Matrix_multiplication_diagram.png
new file mode 100644
index 0000000000000000000000000000000000000000..dab4d022d19e7ec9a5c5e319624e06b83c4b8e6a
Binary files /dev/null and b/_static/figures/Threads/figures/188px-Matrix_multiplication_diagram.png differ
diff --git a/_static/figures/Threads/figures/500px-AmdahlsLaw.png b/_static/figures/Threads/figures/500px-AmdahlsLaw.png
new file mode 100644
index 0000000000000000000000000000000000000000..88f5ca4a67c9ef54f4524406af8be2c6e0b4de03
Binary files /dev/null and b/_static/figures/Threads/figures/500px-AmdahlsLaw.png differ
diff --git a/_static/figures/Threads/figures/534px-Transistor_Count_and_Moore's_Law_-_2011.png b/_static/figures/Threads/figures/534px-Transistor_Count_and_Moore's_Law_-_2011.png
new file mode 100644
index 0000000000000000000000000000000000000000..59e3a76c16693c6ab9b23408b80a0684f83344a7
Binary files /dev/null and b/_static/figures/Threads/figures/534px-Transistor_Count_and_Moore's_Law_-_2011.png differ
diff --git a/_static/figures/Threads/figures/figures-001-c.png b/_static/figures/Threads/figures/figures-001-c.png
new file mode 100644
index 0000000000000000000000000000000000000000..a0ff019643f3ca8dc37280af260db5b8705ad6b6
Binary files /dev/null and b/_static/figures/Threads/figures/figures-001-c.png differ
diff --git a/_static/figures/Threads/figures/figures-002-c.png b/_static/figures/Threads/figures/figures-002-c.png
new file mode 100644
index 0000000000000000000000000000000000000000..688d0bcf532749b37b71add50e6c7e2f3a25ae4c
Binary files /dev/null and b/_static/figures/Threads/figures/figures-002-c.png differ
diff --git a/_static/figures/Threads/figures/figures-S7-001-c.png b/_static/figures/Threads/figures/figures-S7-001-c.png
new file mode 100644
index 0000000000000000000000000000000000000000..974e4c0f84ef855d882f4814f0458baefa3ee289
Binary files /dev/null and b/_static/figures/Threads/figures/figures-S7-001-c.png differ
diff --git a/_static/figures/Threads/figures/figures-S7.001.png b/_static/figures/Threads/figures/figures-S7.001.png
new file mode 100644
index 0000000000000000000000000000000000000000..c4d7204a604b7051abdbae8a0ffca652e5bfc145
Binary files /dev/null and b/_static/figures/Threads/figures/figures-S7.001.png differ
diff --git a/_static/figures/Threads/figures/figures.001.png b/_static/figures/Threads/figures/figures.001.png
new file mode 100644
index 0000000000000000000000000000000000000000..1eafaaf6424b4e487ecc5bade3da7fbbc379ece0
Binary files /dev/null and b/_static/figures/Threads/figures/figures.001.png differ
diff --git a/_static/figures/Threads/figures/figures.002.png b/_static/figures/Threads/figures/figures.002.png
new file mode 100644
index 0000000000000000000000000000000000000000..c628b10544100f2505b2442139dcc5da9acc23cb
Binary files /dev/null and b/_static/figures/Threads/figures/figures.002.png differ
diff --git a/_static/figures/Threads/figures/figures.003.png b/_static/figures/Threads/figures/figures.003.png
new file mode 100644
index 0000000000000000000000000000000000000000..b82cd30a4334bc15f26d27da2e9e245beb5ca91b
Binary files /dev/null and b/_static/figures/Threads/figures/figures.003.png differ
diff --git a/_static/figures/Threads/figures/figures.004.png b/_static/figures/Threads/figures/figures.004.png
new file mode 100644
index 0000000000000000000000000000000000000000..3445a331b7c406b02d4d801708041982a18afcac
Binary files /dev/null and b/_static/figures/Threads/figures/figures.004.png differ
diff --git a/_static/figures/Threads/figures/figures.005.png b/_static/figures/Threads/figures/figures.005.png
new file mode 100644
index 0000000000000000000000000000000000000000..27881b8978fbc2b348e172c99ff3e45936ff4b0a
Binary files /dev/null and b/_static/figures/Threads/figures/figures.005.png differ
diff --git a/_static/figures/Threads/figures/figures.006.png b/_static/figures/Threads/figures/figures.006.png
new file mode 100644
index 0000000000000000000000000000000000000000..32116684e932b767b2fcab2a87a5d6304b3a29ec
Binary files /dev/null and b/_static/figures/Threads/figures/figures.006.png differ
diff --git a/_static/figures/Threads/figures/figures.007.png b/_static/figures/Threads/figures/figures.007.png
new file mode 100644
index 0000000000000000000000000000000000000000..d1bb346e918b4b94f3b67bde3dc0a9ebcad16be3
Binary files /dev/null and b/_static/figures/Threads/figures/figures.007.png differ
diff --git a/conf.py b/conf.py
index 483ae6fcdfc2c003a4a7b0b3318fc633d57be522..ddd3ce4384a51d841c87886b0176ddb94e791af6 100644
--- a/conf.py
+++ b/conf.py
@@ -25,7 +25,12 @@ import sys, os
 
 # Add any Sphinx extension module names here, as strings. They can be extensions
 # coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
-extensions = ['sphinx.ext.todo', 'sphinx.ext.ifconfig', 'sphinx.ext.mathjax' ]
+extensions = ['sphinx.ext.todo', 'sphinx.ext.ifconfig', 'sphinx.ext.mathjax', 'sphinx.ext.intersphinx', 'sphinxcontrib.spelling' ]
+
+
+#spelling
+spelling_lang='fr'
+spelling_word_list_filename='../dict.txt'
 
 # ucomment
 #sys.path.append(os.path.abspath(os.getcwd()))
@@ -51,17 +56,17 @@ source_encoding = 'utf-8'
 master_doc = 'index'
 
 # General information about the project.
-project = u'SINF1252'
-copyright = u'2013, O. Bonaventure, G. Detal, C. Paasch'
+project = u'LEPL1503 : Introduction au langage C'
+copyright = u'2013, 2019, O. Bonaventure, G. Detal, C. Paasch'
 
 # The version info for the project you're documenting, acts as replacement for
 # |version| and |release|, also used in various other places throughout the
 # built documents.
 #
 # The short X.Y version.
-version = '2013'
+version = '2019'
 # The full version, including alpha/beta/rc tags.
-release = '2013'
+release = '2019'
 
 # The language for content autogenerated by Sphinx. Refer to documentation
 # for a list of supported languages.
@@ -75,7 +80,7 @@ language = 'fr'
 
 # List of patterns, relative to source directory, that match files and
 # directories to ignore when looking for source files.
-exclude_patterns = ['_build', '.#*', '*/.#*', 'Exercices/QCM/*' ]
+exclude_patterns = ['_build/**', '.#*', '**/.#**', 'Exercices/QCM/**', "**.BASE.**", "**.REMOTE.**", "**.LOCAL.**", "**.BACKUP.**", "MemoireVirtuelle/**", "Assembleur/**", "Fichiers/fichiers-signaux.rst", "Threads/processus.rst" ]
 
 # The reST default role (used for this markup: `text`) to use for all documents.
 #default_role = None
@@ -103,6 +108,10 @@ rst_epilog = """
 .. include:: /incl_links.rst
 """
 
+# Intersphinx
+intersphinx_mapping = {'theorie': ('https://sites.uclouvain.be/SystInfo/notes/Theorie/html/', None), 'outils': ('https://sites.uclouvain.be/SystInfo/notes/Outils/html/', None), 'exercices': ('https://sites.uclouvain.be/SystInfo/notes/Exercices/html/', None)}
+
+
 # -- Options for HTML output ---------------------------------------------------
 
 # The theme to use for HTML and HTML Help pages.  See the documentation for
@@ -119,7 +128,7 @@ html_theme = 'haiku'
 
 # The name for this set of Sphinx documents.  If None, it defaults to
 # "<project> v<release> documentation".
-html_title = u'Systèmes informatiques'
+html_title = u'Langage C'
 
 # A shorter title for the navigation bar.  Default is the same as html_title.
 #html_short_title = None
@@ -194,12 +203,16 @@ latex_elements = {
 
 # Additional stuff for the LaTeX preamble.
 #'preamble': '',
+    'preamble': '''
+    \\hypersetup{unicode=true}
+    '''
+# See https://tex.stackexchange.com/questions/120002/how-to-modify-the-default-latex-package-parameters-of-sphinx    
 }
 
 # Grouping the document tree into LaTeX files. List of tuples
 # (source start file, target name, title, author, documentclass [howto/manual]).
 latex_documents = [
-  ('index', 'SINF1252.tex', u'SINF1252',
+  ('index', 'LEPL1503.tex', u'LEPL1503 : Introduction au langage C',
    u'O. Bonaventure, G. Detal, C. Paasch', 'manual'),
 ]
 
@@ -243,7 +256,7 @@ man_pages = [
 # (source start file, target name, title, author,
 #  dir menu entry, description, category)
 texinfo_documents = [
-  ('index', 'SINF1252', u'SINF1252',
+  ('index', 'SINF1252', u'SINF1252 : Systèmes informatiques',
    u'O. Bonaventure, G. Detal, C. Paasch', 'SINF1252', 'One line description of project.',
    'Miscellaneous'),
 ]
@@ -261,10 +274,10 @@ texinfo_documents = [
 # -- Options for Epub output ---------------------------------------------------
 
 # Bibliographic Dublin Core info.
-epub_title = u'SINF1252'
+epub_title = u'LEPL1503 : Introduction au langage C'
 epub_author = u'O. Bonaventure, G. Detal, C. Paasch'
 epub_publisher = u'O. Bonaventure, G. Detal, C. Paasch'
-epub_copyright = u'2013, O. Bonaventure, G. Detal, C. Paasch'
+epub_copyright = u'2013, 2019, O. Bonaventure, G. Detal, C. Paasch'
 
 # The language of the text. It defaults to the language option
 # or en if the language is not set.
@@ -300,9 +313,11 @@ epub_copyright = u'2013, O. Bonaventure, G. Detal, C. Paasch'
 # Allow duplicate toc entries.
 #epub_tocdup = True
 
-try:
-	open('.staff','r')
-	tags.add('staff')
-	print "Build as staff member"
-except:
-	print "Build as student"
+#try:
+#	open('.staff','r')
+#	tags.add('staff')
+#	print "Build as staff member"
+#except:
+#	print "Build as student"
+
+mathjax_path="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML"
diff --git a/index.rst b/index.rst
index 4c0a9a7a75df69ef9320d12ac281f63e88bd424a..5777bff2ac3c2ce099d7abd1fa31a2e34a0bb155 100644
--- a/index.rst
+++ b/index.rst
@@ -42,12 +42,6 @@ Langage C
    Theorie/C/malloc
    Theorie/C/linker.rst
 
-Structure des ordinateurs
-*************************
-.. toctree::
-   :maxdepth: 2
-
-   Theorie/Assembleur/memory
 
 Systèmes Multiprocesseurs
 *************************
@@ -57,7 +51,7 @@ Systèmes Multiprocesseurs
    Theorie/Threads/threads
    Theorie/Threads/threads2
    Theorie/Threads/coordination
-   Theorie/Threads/processus
+.. Theorie/Threads/processus
 
 Fichiers
 ********
@@ -66,37 +60,28 @@ Fichiers
    :maxdepth: 2
 
    Theorie/Fichiers/fichiers
-   Theorie/Fichiers/fichiers-signaux
-
-
-Mémoire virtuelle
-*****************
-
-.. toctree::
-   :maxdepth: 2
-
-   Theorie/MemoireVirtuelle/vmem
-
-
-
-******
-Outils
-******
-
-.. toctree::
-   :maxdepth: 2
-
-   Outils/intro-outils
-   Outils/git
-   Outils/make
-   Outils/ssh
-   Outils/cunit
-   Outils/processus
-   Outils/valgrind
-   Outils/gdb
-   Outils/gprof
-   Outils/shell
-   Outils/gcc
+..   Theorie/Fichiers/fichiers-signaux
+
+
+..
+	******
+	Outils
+	******
+
+	.. toctree::
+	   :maxdepth: 2
+
+	   Outils/intro-outils
+	   Outils/git
+	   Outils/make
+	   Outils/ssh
+	   Outils/cunit
+	   Outils/processus
+	   Outils/valgrind
+	   Outils/gdb
+	   Outils/gprof
+	   Outils/shell
+	   Outils/gcc
 
 *******
 Annexes
diff --git a/website/blog.rst b/website/blog.rst
index f4623acff22076d5af2a33d28f5497fd9bcd7cb8..f7c5537c095d5774e3714e0cee4f6ef4e409b461 100644
--- a/website/blog.rst
+++ b/website/blog.rst
@@ -1,16 +1,12 @@
 .. -*- coding: utf-8 -*-
 .. Copyright |copy| 2012-2014 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/>`_  
+.. Ce fichier est distribué sous une licence `creative commons <http://creativecommons.org/licenses/by-sa/3.0/>`_
 
 Blog
 ====
 
-Un blog est associé au cours. Il est hébergé sur `github <https://www.github.com`_ et est accessible depuis l'URL 
+Un blog est associé au cours. Il est hébergé sur `github <https://www.github.com>`_ et est accessible depuis l'URL 
 https://obonaventure.github.io/SystInfoBlog
 
 Il sera alimenté par les étudiant-e-s qui suivent le cours avec des informations qu'ils-elles considèrent comme
-utiles. 
-
-
-
-
+utiles.