Print
Category: Uncategorised
Hits: 19399

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>


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

Exercice 2 : Entrées/Sorties standard

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 :

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 ?