TP1 - Programmation système (M3101-1) SE TP UE31
Conseils préliminaires
Pour compiler, vous pouvez utiliser la commande gcc de la façon suivante :
gcc -Wall -o <nomDuFichierExécutable> <nomDuFichierSource>
Pour lancer votre programme, vous écrirez
./<nomDuFichierExécutable>
Pour obtenir de la documentation sur les primitives ou commandes système, utilisez la commande
man <n> <nomDeLaPrimitive>
où n est la section du manuel contenant les informations sur la primitive. Ce numéro est généralement spécifié entre parenthèses après le nom de la primitive.
IMPORTANT: pensez à inclure les bonnes bibliothèques dans votre fichier source (cf. man
pour savoir quelles bibliothèques inclure)...
Directives générales
Dans tous les programmes que vous écrivez, vous devez prendre soin de tester toutes les situations d'échec, et le cas échéant, d'afficher un message sur l'erreur standard, et de quitter le programme avec un statut différent de zéro, conformément aux conventions Unix.
Notez qu'après l'échec d'un appel système, la procédure perror(3)
peut être utilisée pour produire automatiquement un message d'erreur décrivant l'anomalie rencontrée.
Exercice 1 : Paramètres en ligne de commande
Ecrivez un programme C nommé monEcho
qui simule le comportement de la commande Unix echo
. Par exemple, l’exécution de
./monEcho ceci est un essai
aura pour effet d’afficher à l’écran :
ceci est un essai
Vous utiliserez pour cela les deux paramètres de main
généralement appelés argc
et argv
tels que
argc
est de typeint
et contient le nombre d’arguments de la commande ayant lancémain
;argv
est de typechar**
et contient l’adresse d’un tableau comportantargc
éléments, chacun de ces éléments
étant un des arguments :argv[0]
est le nom du programme exécutable,argv[1]
est le nom du premier argument,argv[2]
le nom du deuxième, ...
Exercice 2 : Entrées/Sorties standard
- Écrivez un programme
hello
qui affiche le texte Hello world à l’écran en utilisant la primitive systèmewrite(2)
. - Écrivez un programme
monCat
qui lit une ligne de texte entrée au clavier en utilisant la primitive systèmeread(2)
puis affiche cette ligne à l’écran en utilisant la primitive systèmewrite(2)
.
On rappelle que le descripteur de fichiers correspondant à l’entrée standard (généralement le clavier) est 0 et celui correspondant à la sortie standard (généralement l’écran) est 1.
Exercice 3 : La commande cp
Écrivez un programme monCp
qui prend en arguments deux noms de fichiers et copie le contenu du premier fichier dans le second. Votre programme affichera des messages d’erreur appropriés sur la sortie d’erreur standard dans les cas suivants :
- nombre d’arguments différent de 2,
- problème à l’ouverture d’un des deux fichiers,
- problème à l’écriture.
Si le deuxième nom passé en argument correspond au nom d’un fichier existant, alors le contenu de ce fichier sera écrasé ; sinon vous devrez créer ce fichier (il devra avoir les droits en lecture et en écriture pour l’utilisateur).
Vous utiliserez les primitives système open(2)
pour ouvrir les fichiers, read(2)
et write(2)
pour lire et écrire dans les fichiers, et close(2)
pour fermer les fichiers. Vous déclarerez en constante la taille du tableau de caractères utilisé par les primitives système read
et write
, définissant le nombre (maximal) de caractères lus et écrits à chaque appel. Dans un premier temps, ce nombre sera égal à 10000.
Dans un second temps, vous créerez un exécutable monCp1
identique à monCp
mais utilisant un tableau de 1 caractère pour les transferts. Vous utiliserez les deux exécutables monCp
et monCp1
pour recopier le fichier loremipsum qu'on vous fournit, et vous comparerez les temps d'éxécution en utilisant la commande Unix time(1)
.
Que constatez-vous ? Comment l'expliquez vous ?