Formation Unix/Linux

Programming, Unix, C Language · course

Voir tous les documents en systèmes d'exploitation et cloud

Formation Unix/Linux (9)

Introduction `a la programmation C sous Unix

Olivier BOEBION

Mars 2004

1 Le langage C

Introduire un langage de d´eveloppement dans des travaux pratiques sur un syst`eme d’ex-

ploitation peut vous paraˆıtre curieux. Si vous devez travailler sur des syst`emes utilisant UNIX

ou Linux, vous constaterez que le langage C est incontournable. Le noyau, les diff´erents in-

terpr´eteurs de commande (csh, bash...), les commandes du syst`eme d’exploitation (ls, cp, rm ...)

sont ´ecrits avec le langage C. Si vous voulez enrichir le syst`eme avec une application nouvelle,

celle-ci sera le plus souvent ´ecrite avec ce langage et vous devrez parfois savoir la compiler.

Le langage C est un langage d’int´erˆet g´en´eral et il est portable. Il n’est pas affect´e `a un type

de programmation comme, par exemple, le Cobol pour les bases de donn´ee ou encore le For-

tran pour le calcul. Il offre la possibilit´e d’effectuer des op´erations de bas niveaux, op´erations qui

permettent l’´ecriture de systemes d’exploitation. Il possede un jeu d’instructions limit´e enrichie

par de nombreuses librairies. La grande majorit´e des syst`emes d’exploitation ont un compilateur

C et un effort de normalisation a ´et´e effectu´e `a travers la norme ANSI.

Le compilateur Gnu C est int´egr´e dans toutes les distributions Linux. C’est avec celui-ci

que nous allons travailler.

2 Construction d’un programme C

2.1 D´eroulement d’une compilation

L’´ecriture d’un programme C donne lieu `a la cr´eation d’un ou plusieurs fichiers sources

(extension .c) contenant les ´el´ements du langage. La cr´eation de fichiers header personnels

(extension .h) permet de d´efinir les fonctions cr´e´ees par l’utilisateur. Une fois ces fichiers prˆets,

l’appel aux compilateur peut se faire. Avec Gnu C, la ligne de commande minimale sera :

Cette ligne de commande cr´ee un fichier ex´ecutable a.out. Pour nommer pr´ecis´ement le

binaire, l’option -o du compilateur suivi du nom est utilis´ee :

gcc source.c

gcc -o binaire source.c

1

La cr´eation d’un fichier ex´ecutable a partir de fichiers sources en C fait appel a plusieurs

programmes comme le montre la figure 1.

Fig. 1 – D´eroulement d’une compilation

Le pr´ecompilateur (cpp) est d’abord lanc´e. Il supprime les commentaires et interpr´ete les

directives de compilations qui se trouvent dans les fichiers header ou sources.

L’appel au compilateur (cc ou gcc) permet en une ou deux passes de g´en´erer du code en

assembleur.

L’assembleur (as) cr´ee un fichier objet correspondant au fichier source qui sera trait´e ensuite

par l’´editeur de lien (ld). Cette derni`ere op´eration produit l’ex´ecutable final en r´eunissant les

fichiers objets de l’utilisateur et tous les fichiers objet des librairies n´ecessaires.

2

2.2 Les options du compilateur

Nous venons de voir une premi`ere option (-o) du compilateur. Il en existe de nombreuses

Publicité

(voir le manuel en ligne). Le tableau 1 vous pr´esente quelques unes de ces options.

Options Caract´eristiques

-v

-c

-o

-S

-L

-l

-I

Visualise toutes les actions effectu´ees lors d’une compilation.

Supprime l’´edition de lien. Seul le(s) fichier(s) .o est (sont) g´en´er´e(s).

Sp´ecifie le nom de l’ex´ecutable `a g´en´erer.

Ne g´en`ere pas le fichier ex´ecutable et cr´ee un fichier .s contenant le programme

en assembleur.

Indique un chemin de recherche suppl´ementaire `a l’´editeur de liens pour d’autres

librairies.

Indique une nouvelle librairie `a charger.

Indique un chemin de recherche suppl´ementaire pour des fichiers de d´efinition

(.h)

Tab. 1 – Quelques options du compilateur C

2.3 Exercice

Cr´eez le fichier source bonjour.c qui contient les instructions C suivantes :

include <stdio.h>

int main(void)

{

printf("bonjour\n");

exit(0);

}

Compilez-le pour cr´eer l’ex´ecutable bonjour et testez-le. Recompilez ce programme en

sp´ecifiant l’option -v et commentez ce qui s’affiche.

Trouvez l’option pour ne g´en´erer que le fichier assembleur puis objet de votre source.

3

3 Construction de librairie

Il est int´eressant de se construire des librairies contenant les fonctions les plus fr´equemment

utilis´ees plutˆot que de les r´e´ecrire `a chaque projet. Il suffit ensuite d’indiquer vos librairies au

moment de la compilation. Pour cela, les options -L et -l permettent respectivement d’inclure

un nouveau chemin de recherche pour l’´editeur de lien et d’indiquer le nom de librairie.

3.1 Exercice : Cr´eation d’une librairie

Vous trouverez ci-dessous 2 fonctions qui affichent ”Bonjour” et ”Au revoir” autant de fois

que le nombre pass´e en argument :

void bonjour(int nbre)

{

int i;

Publicité

for(i=0;i<nbre;i++) printf("Bonjour ...\n");

return;

}

void revoir(int nbre)

{

int i;

for(i=0;i<nbre;i++) printf("Au revoir ...\n");

return;

}

Placez ces fonctions dans des fichiers nomm´es bonjour.c et revoir.c. Compilez ces fichiers

afin de g´en´erer les fichiers objet :

gcc -c bonjour.c revoir.c.

Cr´eez la librairie libsalut.a `a l’aide de la commande ar :

ar r libsalut.a bonjour.o revoir.o

Vous pouvez v´erifier le contenu de votre librairie en tapant :

ar t libsalut.a

4

3.2 Exercice : Utilisation de la librairie

A partir de cette ´etape, vous pouvez d´ej`a utiliser ces fonctions en respectant quelques condi-

tions. La premiere de celles-ci est de placer libsalut.a dans le r´epertoire ou vous effectuez votre

compilation. La seconde est de compiler votre programme en sp´ecifiant le nom de la librairie.

Tapez le programme suivant dans le fichier exemple2.c :

#include <stdio.h>

void main(void)

{

int a=0;

while (a<l||a>5)

{

printf("Donnez un nombre entre 1 et 5 compris: ");

scanf("%d",&a);

printf("\n");

}

bonjour(a);

revoir(--a);

exit(0);

}

Compilez ce programme en ex´ecutant la ligne suivante :

gcc -o exemple exemple2.c libsalut.a

Vous pouvez ensuite placer toutes vos librairies dans un de vos r´epertoires (par exemple,

∼/librairies). Vous lancerez alors votre compilation de la mani`ere suivante :

gcc -o exemple exemple2.c -L∼/librairies -lsalut

4 Compilation s´epar´ee

4.1 Pr´esentation

Publicité

Lorsque vous r´ealisez de gros projets, vous devez d´ecouper ceux-ci en plusieurs programmes

sources. L’avantage est un gain de temps au moment de la compilation. Si une application est

constitu´ee des 3 fichiers sources source1.c, sourc2.c et sourc3.c la compilation d’un ex´ecutable

nomm´e exec est effectu´ee par la ligne suivante :

gcc -o exec sourc1.c sourc2.c sourc3.c

Nous connaissons l’option -c du compilateur qui permet de g´en´erer des fichiers objets sans

effectuer une ´edition de lien. Si vous modifiez un des fichiers source (par exemple, sourc3.c),

nous utilisons cette option pour ne compiler que le fichier modifi´e :

gcc -c sourc3.c

gcc -o exec sourc3.o sourc1.o sourc2.o

5

4.2 Exercices

Sur ”http ://www.obs-vlfr.fr/∼boebion/Unix”, t´el´echarger les fichiers menu.c, header.h,

date.c et fichier.c. Ces 4 fichiers compose une application qui permet d’afficher la date locale

du systeme et demande un nom de fichier pour indiquer la date de sa derniere modification.

Compilez cette application avec comme nom d’ex´ecutable prog et v´erifiez son bon fonction-

nement. Ajoutez ensuite la ligne suivante a la neuvieme ligne de fichier.c :

printf("Affichage de la date de modification d’un fichier.\n");

Qu’effectuez-vous comme compilations pour prendre en compte ce changement ?

5 Les fichiers make

5.1 Int´erˆet et syntaxe

Lorsqu’on r´ealise un projet en le d´ecoupant en plusieurs modules, vous constatez qu’il est

difficile de se rappeler ce qu’il faut recompiler apr`es une modification.

La commande make permet de maintenir un programme automatiquement. Pour cela, elle

utilisera un fichier de description nomm´e en g´en´eral makefile ou Makefile qui contient des

d´ependances et les actions `a mettre en oeuvre pour maintenir le programme.

La syntaxe de la commande make est la suivante :

make [-f nom fichier] [-arg optionnels] [ref..]

L’option -f indique le nom du fichier de description. En g´en´eral, la commande est lanc´ee

sans argument. Dans ce cas, elle recherche un fichier de description sur le r´epertoire courant.

Parmi les arguments optionnels, vous trouverez :

– -s (mode silencieux) : pas d’affichage des commandes avant ex´ecution ;

– -n : l’ensemble des commandes `a effectuer est affich´e mais non ex´ecut´e ;

– -d (mode debug) : le maximum d’informations est affich´e.

5.2 Contenu d’un fichier Makefile

Un fichier Makefile contient :

– les d´ependances entre les fichiers sources composant votre application ;

– les actions lanc´ees suivant la modification d’un de ces fichiers sources ;

– des variables qui permettent de fixer des chemins, des noms d’ex´ecutable etc...

6

5.3 Description du fichier Makefile

On ´ecrit un fichier Makefile en pla¸cant d’abord les variables g´en´erales. Les d´ependances de

l’ex´ecutable suivent ensuite avec l’action associ´ee. Si ce n’est pas le cas, vous devrez sp´ecifier le

Publicité

nom du programme a g´en´erer comme parametre de la commande make. On termine enfin le

fichier en d´eclarant toutes les autres d´ependances.

Il est conseill´e d’utiliser la tabulation lorsqu’on s´epare un champs d’un autre. La commande

make g`ere difficilement les espaces. Le fichier Makefile suivant permet de maintenir le projet

prog :

OBJS=menu.o fichier.o date.o

EXEC=prog

INSTALLDIR=.

LIBS=~/librairie

CC=gcc

prog: $(OBJS)

$(CC) $(OBJS) -o $(EXEC)

date.o: date.c header.h

$(CC) -c date.c

menu.o: menu.c header.h

$(CC) -c menu.c

fichier.o: fichier.c header.h

$(CC) -c fichier.c

install:

cp $(EXEC) $(INSTALLDIR)/prog2

clean:

rm *.o prog

EXEC est une variable contenant le nom de l’ex´ecutable `a g´en´erer. OBJS est une variable

contenant tous les fichiers objets n´ecessaires `a la construction de prog. Ce qui suit est la liste

des d´ependances et les actions associ´ees. Le ou les fichiers qui d´ependent d’autres fichiers sont

pr´ec´ed´es du caractere :. On peut interpr´eter de la maniere suivante :

– le fichier prog doit ˆetre compil´e si on modifie date.c, menu.c ou fichier.c. On peut

indiquer directement les fichiers objets .o car la commande make sait de mani`ere implicite

qu’un fichier .o d´epend directement d’un fichier .c. La modification d’un fichier .c lancera

donc automatiquement sa compilation en .o et la compilation de prog par la commande

qui suit cette ligne.

– les fichiers menu.o, fichier.o et date.o d´ependent d’une modification de header.h. Si

ce dernier est modifi´e, une compilation compl`ete pour g´en´erer prog sera effectu´ee.

– Les lignes clean et install ne poss`edent pas de d´ependances. Seules des actions sont

d´efinies. En faisant make clean, vous supprimerez les fichiers prog et .o.

5.4 Exercices

Cr´eez ce fichier Makefile. Supprimez tous les fichiers objets de votre r´epertoire et lancez la

commande make. Modifiez les diff´erents fichiers sources et relancez de nouveau make.

7