• Aucun résultat trouvé

TPn 2Desbasespourlaprogrammationr´eseauenC1Biencompileretd´eboguerenC Universit´eParisDiderot–Paris7Programmationr´eseauL3InformatiqueAnne2010-2011,2 semestre

N/A
N/A
Protected

Academic year: 2022

Partager "TPn 2Desbasespourlaprogrammationr´eseauenC1Biencompileretd´eboguerenC Universit´eParisDiderot–Paris7Programmationr´eseauL3InformatiqueAnne2010-2011,2 semestre"

Copied!
4
0
0

Texte intégral

(1)

Universit´ e Paris Diderot – Paris 7 Programmation r´ eseau L3 Informatique Anne 2010-2011, 2

`eme

semestre

TP n 2

Des bases pour la programmation r´ eseau en C

1 Bien compiler et d´ eboguer en C

Exercice 1 [Lire les warning pour mieux programmer] Nous consid´erons le pro- gramme suivant :

#include < s t d i o . h >

i n t main ( ) { i n t a ; a =1;

p r i n t f ( ”%d\n” , a ) ; }

Compiler ce programme dans un premier temps avec gcc puis en utilisant gcc -Wall. Que constatez-vous ? Comment rem´edier ` a cela ?

Remarque : Dor´ enavant, vous devrez compiler toujours en utilisant l’option -Wall et supprimer tous les warnings obtenus.

Exercice 2 [D´ebogage post-mortem] Nous consid´erons le programme suivant :

#include < s t d i o . h >

i n t main ( ) { i n t ∗ p=NULL ;

p r i n t f ( ”%d\n” , ∗ p ) ; return 0 ;

}

Compilez ce programme et ex´ecutez-le. Que se passe-t-il ? Pourquoi ?

Afin de d´etecter d’o` u vient l’erreur, vous pouvez analyser l’ex´ecution de votre pro- gramme ”post-mortem” en utilisant gdb. Pour cela, vous devez faire les op´erations suivantes :

1. Autoriser votre syst`eme ` a cr´eer des core dump pour stocker l’´etat de la m´emoire au moment o` u le processus a crash´e. Il faut faire ulimit -c unlimited.

2. Compiler en donnant l’option -g de fa¸con ` a produire les fichiers utiles au d´ebogage.

1

(2)

3. Lorsque vous ex´ecutez votre programme, un fichier nomm´e core sera alors cr´e´e.

4. Lancer gdb avec a.out et core comme arguments. Que vous affiche-t-il ? Tapez bt (pour backtrace ) que vous affiche-t-il ?

5. En tapant start et en tapant ensuite step, gdb vous permet de regarder la trace de l’ex´ecution pas ` a pas.

Utilisez gdb pour voir o` u le programme suivant fait une erreur.

#include < s t d i o . h >

#include < s t d l i b . h >

typedef struct l i s t e { i n t v a l ;

struct l i s t e ∗ next ; } ∗ l i s t e ;

i n t main ( ) { l i s t e t=NULL;

l i s t e h=m a l l o c ( s i z e o f ( struct l i s t e ) ) ; h− > v a l =2;

h− > next=t ; t=h ;

h=m a l l o c ( s i z e o f ( struct l i s t e ) ) ; h− > v a l =3;

h− > next=t ; t=h ;

p r i n t f ( ”%d\n” , t− > v a l ) ; t=t− > next ;

p r i n t f ( ”%d\n” , t− > v a l ) ; t=t− > next ;

p r i n t f ( ”%d\n” , t− > v a l ) ; return 0 ;

}

Exercice 3 [D´ebogage par simulation] Compilez et ex´ecutez le programme sui- vant :

#include < s t d i o . h >

i n t main ( ) { i n t a ;

p r i n t f ( ”%d\n” , a ) ; return 0 ;

}

Que se passe-t-il ? Pourquoi ? De fa¸con ` a trouver les erreurs vous pouvez utiliser l’outil valgrind (avec l’option --leak-check=full) en lui donnant comme argu- ment l’ex´ecutable. Utilisez valgrind sur les programmes de l’exercice 2. (Compilez

2

(3)

les avec l’option -g).Pour finir, utilisez valgrind sur les deux programmes suivants et d´eduisez-en les erreurs de programmation.

#include < s t d i o . h >

#include < s t d l i b . h >

typedef struct l i s t e { i n t v a l ;

struct l i s t e ∗ next ; } ∗ l i s t e ;

i n t main ( ) { l i s t e t=NULL;

l i s t e h=m a l l o c ( s i z e o f ( struct l i s t e ) ) ; h− > v a l =2;

h− > next=t ; t=h ;

h=m a l l o c ( s i z e o f ( struct l i s t e ) ) ; h− > v a l =3;

h− > next=t ; h=t ;

return 0 ; }

#include < s t d i o . h >

#include < s t d l i b . h >

typedef struct l i s t e { i n t v a l ;

struct l i s t e ∗ next ; } ∗ l i s t e ;

i n t main ( ) { l i s t e t=NULL;

l i s t e h=m a l l o c ( s i z e o f ( struct l i s t e ) ) ; h− > v a l =2;

h− > next=t ; f r e e ( h ) ; f r e e ( h ) ; return 0 ; }

3

(4)

2 Programmation de processus linux

Exercice 4 [Cr´eation de processus]

– ´ Ecrivez un programme qui cr´ee un processus fils. Chaque processus affichera si il est le p`ere ou le fils ainsi que l’identit´e du fils (pour le p`ere) ou du p`ere (pour le fils).

– ´ Ecrivez un programme similaire ` a celui pr´ec´edemment, mais cette fois-ci faˆıtes-en sorte que le p`ere boucle toujours. Regardez ce qu’il advient du processus fils avec la commande ps.

Indication : il faudra vous servir des fonctions fork, getpid, getppid, exit et wait. Pour savoir ce qu’elles font, consultez les pages man.

Exercice 5 [Copie de l’espace m´emoire] ´ Ecrivez un programme qui manipule une variable enti`ere i et qui cr´ee un processus fils. Le p`ere incr´ementera deux fois de 1 la variable et entre les deux incr´ements dormira 2 secondes, et le fils incr´ementera deux fois de 100 la variable et entre les deux incr´ements dormira 2 secondes.

Apr`es chaque incr´ement, chaque processus affichera la valeur de la variable i. Que constatez-vous ?

Exercice 6 [´ Ecriture dans un fichier] ´ Ecrire un programme qui cr´ee un processus fils. Le p`ere et le fils doivent ensuite ´ecrire tous les deux dans le mˆeme fichier, le p`ere ´ecrira ”Je suis le pere” et le fils ”Je suis le fils”.

Indication : pour ´ ecrire dans un fichier, il faudra vous servir des fonctions fopen, fclose et fprintf. L` a encore, pour savoir ce qu’elles font et comment les utiliser, consultez les pages man.

4

Références

Documents relatifs

Lancez la commande nc avec l’option -l 8080, cela ouvre un serveur sur votre machine locale sur le port 8080.. Tapez une ligne dans

Les hints prennent aussi le forme d’une structure addrinfo : vous pouvez indiquer des restrictions sur le type de socket que vous souhaitez utiliser (si vous n’avez aucune

Testez votre serveur ` a l’aide d’un navigateur web et assurez-vous que votre programme est capable d’accepter plusieurs connections de suite.. Exercice 3 [Lecture

Pour comparer une distribution de fréquences d’une variable nominale à une distribution de référence, on utilise classiquement la courbe de concentration de la première

Il est evident que les constantes de fx montent dans ce produit à une dimension marquée par le nombre des racines ou par le degré de l'équation y(x) = 0; ainsi, comme ce qu'on dit

On calcule facilement les coordonnées de l’intersection I de (AB) et (CD) à partir des équations de ces droites dans un repère orthonormé (Ox ; Oy).. Si on écrit que I appartient

Un repère orthonormé se présente naturellement : origine au centre du cercle, diamètre [O14, O5] portant l'axe des abscisses (orienté de gauche à droite ), unité le rayon

Si on ne connait pas la formule générale, mais on se souvient que le cercueil de Gauss a été bâti sur une base heptadécagonale comme hommage à sa belle découverte, il reste