\documentclass{article}
\usepackage[latin1]{inputenc}

\title{TD 2 d'Environnement Logiciel}
\date{Mercredi 15 septembre 2004}

\begin{document}
\maketitle

\textbf{Le retour du TD1 Édition de lien}, \verb+gcc+, \verb+ld+,
\verb+make+, \verb+objdump+.

Exemple d'un projet complet: \emph{ecm}.

Ecm pour \emph{Elliptic Curve Method} est un logiciel permettant de
factoriser des nombres entiers via la méthode des courbes elliptiques.
C'est surtout un projet contenant plusieurs modules en \verb+C+ que
l'on va utiliser pour illustrer la compilation séparée.

\begin{itemize}

\item Récupérez les sources du projet avec la commande:\\
\verb+cvs -d:pserver:cvs@cvs-sop.inria.fr:/CVS/spaces co ecm+.
Un répertoire \verb+ecm+ contenant le projet va être créé dans le
répertoire courant.

\item Combien de fichiers \verb+C+ composent le projet?

\item Où se trouve le point d'entrée du programme?

\item Tapez \verb+make+ et observez la sortie à l'écran. Avec
\verb+ls -la+ avant et après l'exécution de \verb+make+, regardez les
fichiers créés par la commande. \verb+make+ est une commande très
utile pour le développeur, voir\\
\verb+http://www.gnu.org/software/make/+ pour plus d'informations.

\item Tapez \verb+make clean+ et recommencez la compilation à la main
(sans utilisez \verb+make+) avec l'utilisation de \verb+gcc+ et
\verb+ld+.

\item Plus fort: observez les diverses étapes de la compilation d'un
fichier \verb+C+ de votre choix en utilisant \verb+gcc -E+,
\verb+gcc -S+, \verb+gas+...

\item Après avoir tapé \verb+make+, retapez \verb+make+. Normalement,
il ne se passe rien.

\item Exécutez \verb+touch median.o+ puis \verb+make+. Que se
passe-t-il? Pourquoi?

\item Éditez la fonction \verb+main+ du projet pour afficher un
message de bienvenu de votre choix à chaque démarrage et tapez
\verb+make+. Quels étapes de la création du fichier exécutable final
sont effectuées?

\item Dissection avec \verb+objdump+: à l'aide de la page de manuel
d'\verb+objdump+, regardez le contenu des fichiers objets produits.

\item Et si les binutils n'existaient pas:

\verb+http://www.comms.scitech.susx.ac.uk/fft/programming/teensy.html+.

\end{itemize}

\textbf{Entrées-sorties en C}

\begin{itemize}

\item Comparez les résultats de \verb+printf("tic");+, de
\verb+fprintf(stdout, "tic");+ et de \verb+fprintf(stderr, "tic");+.

\item Comparez les résultats de 
\verb+{ fprintf(stdout, "tic"); while (1);}+ et de
\verb+{ fprintf(sterr, "tic"); while (1);}+.

\item Comparez les résultats de 
\verb+{ fprintf(stdout, "tic"); fflush(stdout); while (1);}+ et de
\verb+{ fprintf(sterr, "tic"); while (1);}+.

\item Comparez les résultats de 
\verb+{ fprintf(stdout, "tic\n"); while (1);}+ et de
\verb+{ fprintf(sterr, "tic\n"); while (1);}+.

\item Comparez \verb+scanf("%d", &x);+ et \verb+fscanf("%d", &x);+.

\end{itemize}

Les objets \verb+stdin+, \verb+stdout+ et \verb+stderr+ sont
respectivement appelés \emph{entrée standard}, \emph{sortie standard}
et \emph{sortie standard d'erreur}. Ils correspondent aux \emph{file
descriptor} \verb+STDIN_FILENO+, \verb+STDOUT_FILENO+ et
\verb+STDERR_FILENO+ (voir \verb+/usr/include/unistd.h+).

\textbf{Fichiers}

Les objets fichiers (ou plus exactement \emph{stream}) ont pour type
\verb+FILE *+. Quel est le stype de \verb+stdin+, \verb+stdout+ et
\verb+stderr+? (cf. \verb+/usr/include/stdio.h+)

\begin{itemize}

\item Créez un fichier à partir d'un programme à l'aide de 
\verb+f = fopen("fichier", "w");+. Cette fonction retourne un objet de
type \verb+FILE *+. Écrivez quelques lignes dans le programme en
utilisant \verb+fprintf+ avec comme premier paramètre \verb+f+.
N'oubliez pas de fermer le fichier avec \verb+fclose+.

\item Que se passe-t-il si vous exécutez plusieurs fois votre
programme? Remplacez \verb+w+ par \verb+a+ dans la commande
\verb+fopen+ et réitérez l'expérience.

\item À quoi correspondent les différents modes? Expliquez le
comportement observé.

\item Créez deux programmes \verb+p1.c+ et \verb+p2.c+. Le programme
\verb+p1.c+ demande un entier \verb+n+ à l'utilisateur puis écrit les
entiers de 0 à $n-1$ dans un fichier \verb+fichier_int+ (avec
éventuellement des informations supplémentaires si nécessaire).
\verb+p2.c+ doit être capable de lire la suite d'entiers écrite dans
le fichier \verb+fichier_int+ et de la stocker dans un tableau de
\verb+n+ entiers alloué dynamiquement avec \verb+malloc+, puis
d'afficher le contenu du tableau.

\item Écrivez un programme qui affiche le nombre de lignes d'un
fichier. Comparez le résultat de votre programme avec la commande
\verb+wc -l+.

\item Modifiez votre programme pour que le nom du fichier à analyser
puisse être donné en paramètre. Rappel: pour un programme écrit en
\verb+C+ et déclarant sa fonction \verb+main+ par
\verb+int main (int argc, char *argv[])+, \verb+argc+ correspond au
nombre d'arguments présents sur la ligne de commande et le tableau
\verb+argv+ contient ces arguments: \verb+argv[0]+ est le nom du
programme, \verb+argv[1]+ le premier argument...

\item Modifiez votre programme pour afficer également le nombre de
mots et comparez avec \verb+wc fichier+.

\end{itemize}

\textbf{Shell et redirections}

\begin{itemize}
\item Essayez :

	\begin{enumerate}

	\item \verb+sort < fichier.txt+
	\item \verb+echo 10 > num.txt+
	\item \verb+echo 20 >> num.txt+
	\item \verb+ls | wc -l+
	\item \verb+ps aux | grep `whoami`+.

	\end{enumerate}

en expliquant ce qu'il se passe dans chaque exemple.

\item Que constatez vous si vous exécutez \verb+ls > /dev/null+? Quel
est l'intérêt de la redirection vers \verb+/dev/null+? Voir:\\
\verb+http://www.freebsd.org/doc/en_US.ISO8859-1/books/faq/funnies.html#DEV-NULL+

\item Quel est le résultat de \verb+cat < /dev/null > ficiher.txt+?
Qu'en déduisez vous sur un usage possible de cette commande?

\item Les commandes \verb+head+ et \verb+tail+ affichent
respectivement le début et la fin d'un fichier. Écrivez le script
\verb+milieu <debut> <fin> <fichier>+ qui met à profit ces deux
commandes pour afficher les lignes de \verb+debut+ à fin incluses du
fichier \verb+fichier+.

\end{itemize}

\textbf{Entrée sortie, encore}

\begin{itemize}

\item Écrivez une version en \verb+C+ de \verb+cat+ en utilisant
uniquement les fonctions d'entrée sortie de la bibliothèque standard
\verb+fread+ et \verb+fwrite+, et en lisant et écrivant des blocs d'un
caractère.

\item Écrivez une seconde version de \verb+cat+ en utilisant
uniquement les appels systèmes \verb+read+ et \verb+write+.

\item En utilisant la commande \verb+time+ comparez les performances
des deux versions pour une lecture/écriture d'un fichier
raisonnablement volumineux.

\item Interprétez les résultats obtenus. Quels sont les commandes de
plus bas niveau: \verb+read/write+ ou \verb+fread/fwrite+?

\item Essayez le programme suivant:

\begin{verbatim}

#include <stdio.h>
#include <unistd.h>

int main ()
{
    fwrite ("Hello ", sizeof(char), 6, stdout);
    write (STDOUT_FILENO, "World !", 7);

    return 0;
}
\end{verbatim}

\end{itemize}

\end{document}
