Cours C 1 cmmandes Linux de base et introduction au langage c
….
Objectif du cours de C
Planning
– 5 ou 6 cours, 5 TD sur machine
– 1 projet
– 5 cours, 5 TD sur machine
– 1 projet, peut-être commun avec l'algo
– 1 examen
Objectif du stage de rentrée
– les commandes système de base
– l'écriture et la compilation propre d'un programme C simple
– 2h de cours, 2h de TD, 4h de TP (1 par poste)
– TP noté pour évaluation
– open source
– gratuit
Différences principales avec
Windows
– racine unique /
– périphériques vus comme des sous répertoires. Ex: /mnt/floppy pour A:\
– Hello.txt ≠ hello.txt ≠ HELLO.TXT
Compte utilisateur
/home/ens/paumier ou Npaumier
– on y est par défaut quand on se loge
Lister un répertoire
cogmu/ plp/ projet.html
total 16
drwxr-xr-x 3 paumier igm 4096 sep 18 2006 cogmu/
drwxr-xr-x 2 paumier igm 4096 jui 26 2006 plp/
-rw-r--r-- 1 paumier igm 4764 nov 20 2006 projet.html
Fichiers spéciaux et cachés
. = répertoire courant
.. = répertoire parent
.xxxxx = fichier caché
– utiles pour des fichiers de configuration
Fichiers visibles avec ls -a
./ ../ .bashrc cogmu/ plp/ projet.html
Répertoires
– relatif:
– absolu:
– retour à la racine du compte:
Répertoires
mkdir toto
rmdir toto si toto est vide
rm -ri toto sinon
rm -rf toto pour éviter de confirmer pour chaque fichier
Copie et renommage
cp toto ../titi
cp -r toto/ tutu
mv toto tutu
mv toto ../../test/toto.txt
Droits d'accès
-rwxrw-r-- 1 paumier igm 0 jun 22 11:02 toto
- rwx rw- r--
- = fichier
d = répertoire (directory)
Droits du possesseur du fichier (paumier)
Droits d'accès fichier F répertoire R
r on peut lire F on peut voir le contenu de R w on peut écrire dans F ou le détruire on peut créer des fichiers ou des répertoires dans R
x on peut exécuter F si
F est un exécutable on peut rentrer dans R avec cd
Pour pouvoir créer un fichier titi/tutu, on doit avoir les droits w et x sur titi
Changer les droits
– avant: -rw-r--r--
– après: --wxr--r--
g modifie les droits du groupe
Changer les droits
– avant: -rw-r--r--
– après: -rwxr-xr-x
chmod g-r,o-r toto
– avant: -rw-r--r--
– après: -rw
Lancer une tâche de fond
$>anjuta&
[1] 2715
– lance un autre processus
Voir les processus en cours
PID TTY TIME CMD
1962 pts5 00:00:00 bash
3517 pts5 00:00:00 emacs
3518 pts5 00:00:00 ps
Tuer un programme
– on pourra y revenir avec tg
Afficher un fichier
Rediriger les sorties
>$ ls -l
total 8
d 2 paumier igm 4096 jun 22 17:13 titi/
-rw-r--r 1 paumier igm 11 jun 22 17:13 tutu
>$ ls * > list 2> err
>$ cat list
tutu
>$ cat err
ls: titi: Permission denied
Fichier spécial /dev/null
de ls:
ls > /dev/null
Chercher dans des fichiers
lignes des fichiers *.txt qui contiennent
xxx
>$ grep passwd ind*
index:chpasswd (8) - update password file in batch
index2:passwd [ssl-passwd] (1) - compute password hashes
ind:rpc.yppasswdd [rpc] (8) - NIS password update daemon
Obtenir de l'aide
Introduction au C
Ou comment compiler proprement son premier programme
Kenneth Thompson
Quelques références
+ tous les livres qui prennent la poussière à la bibliothèque...
Qu'est-ce qu'un programme?
Instructions dans un langage lisible par un humain
Fichiers objets
Programme exécutable
Les fichiers sources
– bibliothèque mathématique, graphique, ...
Le premier programme
Inclusion de la bibliothèque contenant la fonction printf
Le premier programme main est toujours la fonction principale d'un programme C
Retourne un
entier
argc : nombre de paramètres
argv : les paramètres
Le premier programme
Début de bloc d'instructions
La fonction se termine et renvoie 0
Fonction affichant à l'écran une chaîne de caractères
Le premier programme
$>gcc HelloWorld.c -c
$>gcc HelloWorld.o -o HelloWorld
ou, en une étape:
$>gcc HelloWorld.c -o HelloWorld
$>./HelloWorld
Hello world!
Un autre exemple
Le même en deux fichiers
f1.c f2.c
#include #define PI 3.14
float a,b;
extern float sum(float x,float y);
int main(int argc,char* argv[]) {
float c,d;
a=PI;
b=1;
c=sum(a,b);
printf("%f + %f = %f\n",a,b,c);
printf("d=%f\n",d);
return 0;
} float sum(float x,float y) { return x+y;
}
Déclaration d'une fonction définie dans un autre fichier
Le même en trois fichiers
f1.c f2.c
#include #include "f2.h" #define PI 3.14
float a,b;
int main(int argc,char* argv[]) {
float c,d;
a=PI;
b=1;
c=sum(a,b);
printf("%f + %f = %f\n",a,b,c);
printf("d=%f\n",d);
return 0;
} float sum(float x,float y) { return x+y;
}
f2.h
float sum(float x,float y);
Inclusion du fichier header qui contient la définition de sum
Sources et headers
– on n'inclut pas les .c !
– définitions des fonctions visibles de
l'extérieur du .c
– définitions de constantes
– description de la bibliothèque
– licence du code
Fichiers .h
Þ protection avec des macros
f2.h
#ifndef f2_H #define f2_H
float sum(float x,float y); #endif
Un beau .h
Options de compilation
warnings.c
$>gcc warnings.c
$>gcc warnings.c -Wall -ansi Warnings.c:1: AVERTISSEMENT:
Warnings.c: Dans la fonction « main »:
Warnings.c:3: AVERTISSEMENT: déclaration implicite de la fonction « printf » Warnings.c:2: AVERTISSEMENT: variable inutilisée « b »
Warnings.c:4: AVERTISSEMENT: contrôle a atteint la fin non void de la fonction
Messages d'erreurs
– toujours commencer par la première erreur
cascade.c
int sum(int anint b) { return a+b; }
$>gcc -Wall -ansi cascade.c
cascade.c:1: erreur d'analyse syntaxique avant « b »
cascade.c: Dans la fonction « sum »:
cascade.c:2: « a » non déclaré (première utilisation dans cette fonction)
cascade.c:2: (Chaque identificateur non déclaré est rapporté une seule fois
cascade.c:2: pour chaque fonction dans laquelle il apparaît.)
cascade.c:2: « b » non déclaré (première utilisation dans cette fonction)
Les fichiers Makefile
cible: dépendances
TAB action1
TAB action2
...
Les fichiers Makefile
Cible par défaut
Cible usuelle pour effacer les fichiers produits par le Makefile
Les fichiers Makefile
$> make
gcc -c -Wall -ansi main.c
gcc -c -Wall -ansi angles.c
gcc main.o angles.o -o trigo
Compilation finie.
$> make
make: Rien à faire pour « all ».
Propreté du code
1) indenté proprement (utiliser indent si nécessaire)
Propreté du code
2) commenté judicieusement on ne commente pas la syntaxe!
Propreté du code
3) des identificateurs judicieux
a f(a b,c d) {
if (b==HULL) return HULL; if (b->e==d) return b; return f(b->s,d);
}
ColorList find_color(ColorList l,Color c) { if (l==HULL) return HULL;
if (l->color==c) return l;
return find_color(l->next,c);
}
Propreté du code
4) du code lisible par tous (mondialisation oblige...)
listacores achacor(listacores l,cor c) { if (l==HULL) return HULL; if (l->cor==c) return l; return achacor(l->proxima,d);
}
ColorList find_color(ColorList l,Color c) { if (l==HULL) return HULL;
if (l->color==c) return l;
return find_color(l->next,c);
}
Propreté du code
5) éviter le style gourou
– bon pour l'ego, peut-être
– mauvais pour le code, sûrement
int* pstrand(int* p) { while (!*p++);
return (*p++&=0xE8)?p:0;
}
i,j;main(n){for(;i<1E4;j||printf("%d ",n,++i))for(j=n++;n%j--;);)}
Propreté du code