Click here to load reader
View
4
Download
0
Embed Size (px)
IUT A — Université NANCY II
Département Informatique
2001/2002
Poly Système
Bernard Mangeol, Isabelle Chrisment,
Jean François Mari et Denis Roegel
TABLE DES MATIÈRES version du 30 novembre 2001
1
Table des matières
I Rappels 7
1 Les outils Unix pour développer en C 9
1.1 L’éditeur Emacs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.2 Le compilateur gcc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.2.1 Exemples d’utilisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.2.2 Les options de compilation . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.3 Le débogueur gdb . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.3.1 Les principales commandes de gdb . . . . . . . . . . . . . . . . . . . . . . . . 10
1.4 Les Makefiles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.4.1 Définition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.4.2 Comment ça marche? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
1.4.3 Quelques règles de syntaxe . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.4.4 Règles implicites . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.5 Envoi de programmes par courrier électronique . . . . . . . . . . . . . . . . . . . . . 14
2 Compléments en C 17
2.1 La manipulation des châınes de bits . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.1.1 Définitions de constantes dans différentes bases . . . . . . . . . . . . . . . . . 17
2.1.2 Les opérateurs logiques ET et OU . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.1.3 Les opérateurs de décalage de bits . . . . . . . . . . . . . . . . . . . . . . . . 17
2.1.4 Positionnement d’un bit à 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.1.5 Positionnement d’un bit à 0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.1.6 Tester un bit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.2 Définition d’un pointeur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.3 Utilisation des pointeurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.3.1 L’opérateur & . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.3.2 Propriétés de l’opérateur & . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.3.3 L’opérateur d’accès indirect * . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.3.4 L’opérateur d’accès indexé [] . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2 TABLE DES MATIÈRES
2.4 Les tableaux de pointeurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.4.1 Exemple 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
2.4.2 Les arguments de la commande main . . . . . . . . . . . . . . . . . . . . . . . 21
2.5 Exemple récapitulatif : la fonction Unix echo . . . . . . . . . . . . . . . . . . . . . . 22
2.5.1 Exemple d’interaction avec le shell . . . . . . . . . . . . . . . . . . . . . . . . 22
II Fichiers et processus 23
3 Le système de gestion de fichiers 25
3.1 Entrées/sorties fichiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
3.1.1 Notion de table des i-nœuds . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
3.1.2 Les types de fichiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
3.1.3 Descripteurs de fichier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
3.1.4 Pointeurs vers un fichier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
3.1.5 Description de quelques primitives et fonctions . . . . . . . . . . . . . . . . . 27
3.2 La manipulation des répertoires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
3.2.1 Les fonctions opendir() et closedir() . . . . . . . . . . . . . . . . . . . . . 30
3.2.2 La fonction readdir() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.2.3 Exercice : la lecture d’un répertoire . . . . . . . . . . . . . . . . . . . . . . . . 31
3.3 Les verrous POSIX : définitions et utilité . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.4 La primitive lockf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
3.5 Exemple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
3.5.1 Remarque . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
3.6 Exercices sur le SGF Unix . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
3.6.1 Ex. 1 : to_exe (simple) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
3.6.2 Ex. 2 : facile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
3.6.3 Ex. 3 : lwd (facile) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
3.6.4 Ex. 4 : plus dur et plus long . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
3.7 Exercices sur les caractéristiques des utilisateurs . . . . . . . . . . . . . . . . . . . . 34
3.7.1 Ex. 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
3.7.2 Ex. 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
3.7.3 Ex. 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
4 Les processus 37
4.1 Définition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
4.2 Les identificateurs de processus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
4.3 L’utilisateur réel et l’utilisateur effectif . . . . . . . . . . . . . . . . . . . . . . . . . . 38
4.3.1 Les primitives getuid et geteuid . . . . . . . . . . . . . . . . . . . . . . . . 38
TABLE DES MATIÈRES version du 30 novembre 2001
3
4.3.2 La primitive getlogin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
4.3.3 Les commandes getpwnam et getpwuid . . . . . . . . . . . . . . . . . . . . . . 39
4.4 Les principales primitives de gestion de processus . . . . . . . . . . . . . . . . . . . . 39
4.4.1 Primitive fork() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
4.4.2 Primitive wait() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
4.4.3 Primitive exit() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
4.5 Les primitives exec() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
4.5.1 Recouvrement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
4.5.2 Comportement vis-à-vis des fichiers ouverts . . . . . . . . . . . . . . . . . . . 47
4.5.3 Remarques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
4.5.4 Exercices : écriture d’une version simplifiée des commandes if et for . . . . 48
III Communication 49
5 Communication inter-processus 51
5.1 Les signaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
5.1.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
5.1.2 Types de signaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
5.1.3 Traitement des signaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
5.1.4 Communication entre processus . . . . . . . . . . . . . . . . . . . . . . . . . . 55
5.1.5 Deux signaux particuliers : SIGCLD et SIGHUP . . . . . . . . . . . . . . . . . . 56
5.1.6 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
5.2 Les pipes ou tubes de communication . . . . . . . . . . . . . . . . . . . . . . . . . . 58
5.2.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
5.2.2 Particularités des tubes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
5.2.3 Création d’un conduit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
5.2.4 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
5.3 Les messages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
5.3.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
5.3.2 Principe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
5.4 Les sémaphores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
5.4.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
5.4.2 Principe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
5.4.3 Sémaphores de Dijkstra . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
5.4.4 Implémentation des sémaphores de Dijkstra . . . . . . . . . . . . . . . . . . . 73
5.4.5 Exemple d’utilisation des sémaphores de