Annales INF122a 05-07
Transcription
Annales INF122a 05-07
Université Joseph Fourier Licence L1 “Sciences et Technologies” UE INF122 Devoir Surveillé du 14 janvier 2005 Durée 1h30 ; Documents autorisés Les exercices sont indépendants Exercice 1 L’utilisateur laurel débute une session de travail en examinant le contenu du répertoire courant : {laurel} 5 >ls -l total 92 -rw-r--r-1 laurel dsu-etu drwxr-xr-x 2 laurel dsu-etu drwxr-xr-x 2 laurel dsu-etu -rw-r--r-1 laurel dsu-etu -rw-r--r-1 laurel dsu-etu -rw-r--r-1 laurel dsu-etu -rw-r--r-1 laurel dsu-etu -rwxr-xr-x 1 laurel dsu-etu -rw-r--r-1 laurel dsu-etu -rw-r--r-1 laurel dsu-etu 226 512 512 129 12 225 173 1115 897 154 Jan Jan Jan Nov Nov Nov Jan Jan Nov Dec 4 7 7 10 11 10 7 8 10 27 10:08 07:03 07:03 17:12 15:04 17:13 07:07 17:04 17:14 15:29 Makefile TP1 TP2 deux.c deux_entiers trois.c installeTP.sh max2 un.c y.c 1. Laurel exécute alors différentes commandes qui se terminent toutes par un message d’erreur. Expliquez dans chaque cas le sens de ces messages d’erreurs et indiquez comment remédier au problème. 1. {laurel} 2 >more deux_entiers 23 12 {laurel} 3 >max2 < resultat > deux_entiers resultat: No such file or directory. {laurel} 4 > 2. {laurel} 6 >which installeTP.sh installeTP.sh: Command not found. {laurel} 7 > 3. {laurel} 21 >gcc -o y y.c Undefined first referenced symbol in file ploumploum /var/tmp//ccMi6qE9.o ld: fatal: Symbol referencing errors. No output written to y collect2: ld returned 1 exit status {laurel} 22 > 4. {laurel} 55 >touch *.c {laurel} 56 >make gcc -c un.c gcc -c deux.c gcc -c trois.c gcc -o quatre un.o deux.o trois.o ld: fatal: symbol ‘zero’ is multiply-defined: (file deux.o type=FUNC; file trois.o type=FUNC); ld: fatal: File processing errors. No output written to quatre collect2: ld returned 1 exit status *** Error code 1 make: Fatal error: Command failed for target ‘quatre’ {laurel} 57 > 2. Ecrivez un contenu possible pour le fichier Makefile. 3. L’utilisateur hardy a aussi écrit un Makefile dans son répertoire personnel. Comment Laurel sait-t-il s’il peut lire le Makefile de son ami ? Quelle(s) commande(s) pourra-t-il alors utiliser pour comparer ces deux fichiers Makefile ? Exercice 2 La commande Unix strings est une commande qui s’applique à un fichier dont le nom est précisé en argument de la ligne de commande : strings fichier Cette commande permet d’afficher à l’écran tous les caractères contenus dans fichier dont les codes Ascii sont situés dans l’intervalle [32, 126] (ce sont les caractères “affichables” du code Ascii). Exemple : si fichier est constitué des caractères dont les codes Ascii sont 12, 32, 65, 69, 5, 4, 77, 89, 14, 35, 101, 102 alors strings fichier affichera à l’écran les caractères dont les codes Ascii sont 32, 65, 69, 77, 89, 35, 101, 102 Ecrivez en C la commande strings. Exercice 3 Ecrivez un programme C min maj.c, compilé sous le nom min maj, qui affiche à l’écran ses arguments en convertissant toutes les lettres minuscules en lettres majuscules (les autres caractères étant inchangés). Exemples : min maj bOnNE nUIt LES petits ... affiche à l’écran : 2 BONNE NUIT LES PETITS ... min maj Vive Inf 122 ! affiche à l’écran : VIVE INF 122 ! Excercice 4 Ecrivez un fichier de commandes de nom sauvegarde.sh permettant de : – Créer un répertoire de nom Archives dans votre répertoire personnel (s’il n’y existe pas déjà) ; – Déplacez dans ce répertoire Archives tous les fichiers exécutables qui se trouvent dans le répertoire dont le nom est donné en argument. Si le répertoire donné en argument n’existe pas, afficher un message d’erreur. Exercice 5 L’administrateur d’une machine souhaite être prévenu lorsque le nombre d’utilisateurs d’une machine dépasse une certaine valeur N. Il souhaite donc écrire un programme qui lui affiche un message chaque fois que cette valeur est dépassée. Pour connaitre le nombre courant d’utilisateurs il dispose de la commande uptime (vue en TP) : {administrateur} 27 >uptime 9:16am up 99 day(s), 23:08, {administrateur} 28 > 2 users, load average: 1.47, 1.60, 1.52 1. Ecrivez un fichier de commande uptime.sh qui exécute la commande uptime toutes les 10 minutes 2. Ecrivez un programme C qui sera compilé sous le nom uptime vers users. Ce programme prend en argument sur la ligne de commande un entier N. Il lit en permanence au clavier le résultat de la commande uptime et affiche un message lorsque le nombre d’utilisateurs dépasse N. 3. Quelle(s) commande(s) doit exécuter notre administrateur pour qu’un message soit affiché chaque fois qu’il y a plus de 15 utilisateurs sur la machine ? Exercice 6 La commande wc -l affiche à l’écran le nombre de lignes du fichier donné en arguments : {batman} 2 >wc -l debordechar.c 35 debordechar.c {batman} 3 > On souhaite connaı̂tre le nombre total de lignes de tous les fichiers suffixés par .c du répertoire courant. 3 1. Décrivez en quelques lignes le principe d’une solution possible. Cette solution peut combiner l’utilisation de commandes existantes ainsi que des programmes C ou fichiers de commandes (dont vous préciserez les fonctionnalités). 2. Donnez la réalisation complète de votre solution. 4 Université Joseph Fourier Licence L1 “Sciences et Technologies” UE INF122 Devoir Surveillé du 20 janvier 2006 Durée 1h30 ; documents autorisés ; les exercices sont indépendants. Indications On donne ci-dessous deux fonctions C qui peuvent être utilisées dans la suite : – la fonction strlen, qui renvoie la longueur d’une chaı̂ne de caractères (sans le ’\0’ final) : strlen("inf122") renvoie l’entier 6 ; – la fonction strcmp, qui renvoie 0 si les deux chaı̂nes de caractères passées en paramètre sont identiques, une valeur différente de 0 sinon : strcmp("inf122", "inf111") renvoie un entier différent de 0, strcmp("inf122", "inf122") renvoie l’entier 0. Exercice 1 1. On donne ci-dessous trois séquences de commandes qui se terminent toutes par une erreur ou par un résultat incorrect. Indiquez dans chaque cas la nature de l’erreur et proposez une solution pour y remédier. séquence 1 : {batman} 17 total 12 -rw-r--r--rw-r--r--rw-r--r--rw-r--r-{batman} 18 essai : x.o gcc x.o : x.c gcc {batman} 19 make: Fatal >ls -l 1 batman batman 80 Jan 18 1 batman batman 130 Jan 18 1 batman batman 224 Jan 18 1 batman batman 476 Jan 18 >more Makefile y.o z.o -o essai x.o y.o z.o 08:30 08:36 08:42 08:43 Makefile x.c y.c z.o -c x.c >make error: Don’t know how to make target ‘y.o’ 5 séquence 2 : {batman} 29 >more somme.c int main(int argc, char *argv[]) { printf("%s + %s = %d \n", argv[1], argv[2], (int) argv[1] + (int) argv[2]) ; return 0 ; } {batman} 30 >gcc -o somme somme.c {batman} 31 >somme 12 42 12 + 42 = -8522073 séquence 3 : {batman} 32>more makerep.sh R=$1 mkdir R {batman} 33 >ls -l total 56 drwxr-xr-x 2 batman batman 512 Jan 18 12:55 R -rwxr--r-1 batman batman 16 Jan 18 12:54 makerep.sh {batman} 12 >makerep.sh TP1 mkdir: Failed to make directory "R"; File exists 2. Vous avez créé (avec nedit) un fichier de commande de nom ex.sh : {batman} 8 >ls -l ex.sh total 2 -rw-r--r-1 batman batman 30 Jan 16 16:17 ex.sh a) Quelle(s) commande(s) utilisez-vous pour que ce fichier puisse être exécuté par vous et votre binôme, mais que, contrairement à vous, celui-ci ne puisse ni le lire ni le modifier ? Quelle sera alors le résultat de la commande ls -l ? b) Inversement, est-il possible de faire en sorte que votre binôme puisse lire, exécuter et modifier ce fichier alors que vous-même ne puissiez que l’exécuter ? Si oui comment, si non pourquoi ? c) D’après vous, où sont mémorisés les droits d’accès associés à un fichier ? (environ 3 lignes). Exercice 2 Ecrivez un fichier de commandes de nom echange.sh permettant d’échanger les contenus de deux répertoires dont les noms sont spécifiés en argument de la ligne de commande. Si le nombre d’arguments est incorrect, ou si l’un des répertoires spécifiés n’existe pas, l’exécution de echange.sh doit se terminer par un message d’erreur. 6 Exercice 3 La commande Unix tr (pour transform) permet de transformer un suite de caractères lue sur l’entrée standard (le clavier) et d’afficher le résultat sur la sortie standard (l’écran). Deux types de transformation sont possibles en fonction des options et paramètres passés en argument de la ligne de commande : codage : tr ’chaine1’ ’chaine2’ Remplace chaque caractère lu au clavier et en position i dans chaine1 par le caractère de position i dans chaine2. exemple : tr ’a+()’ ’A-{}’ transforme la suite de caractères lue au clavier en remplaçant a par A, + par -, { par ( et } par ). Si chaine2 et chaine1 n’ont pas la même longueur alors la commande se termine par un message d’erreur. suppression : tr -d ’chaine1’ Supprime tous les caractères lus au clavier qui appartiennent à chaine1. exemple : tr -d ’ ;’ transforme la suite de caractères lue au clavier en supprimant tous les caractères espace et ;. 1. D’après vous, pourquoi les apostrophes sont-elles nécessaires pour délimiter chaine1 et chaine2 ? 2. On dispose d’un fichier de nom f1. On considère deux transformations possibles de ce fichier : T1 : remplacer tous les chiffres (caractères de 0 à 9) par le caractère * ; T2 : supprimer les caractères ?, : et =. a) Quelle commande utilisez-vous pour produire un fichier f2 en appliquant la transformation T1 à f1 ? b) Quelle commande utilisez-vous pour produire un fichier f3 en appliquant la transformation T2 à f2 ? c) Quelle(s) commande(s) auriez-vous pu utiliser pour produire directement le fichier f3 à partir de f1, sans passer par un fichier intermédiaire ? 3. Ecrivez en C une fonction position qui prend en paramètre un caractère c et une chaı̂ne de caractères s et qui renvoie la position de la 1ère occurrence de c dans s si c appartient à s et -1 sinon. 4. (question difficile) En utilisant la fonction position, écrivez en C la commande Unix tr. On supposera que les arguments fournis par l’utilisateur sont corrects. Exercice 4 On fournit le programme C suivant que l’on compile pour créer l’exécutable pas : #include <stdio.h> int main(void){ char premier; char suite[10]; scanf("%c%s",&premier,suite); printf("%s%c\n",suite,premier); } 1. Décrivez en quelques lignes le comportement de l’exécutable pas. 7 2. On rappelle que la commande echo permet d’afficher une chaı̂ne de caractères sur la sortie standard : {batman} 1 >echo toto toto {batman} 2 > Pour chacune des commandes suivantes indiquez si cette commande est ou non correcte et, si c’est le cas, donnez le résultat obtenu après exécution : – pas < echo roulant – echo roulant | pas – pas < fichier1 où fichier1 contient le texte “12345” – pas < fichier1 >! resultat – echo fichier2 >! pas où fichier2 contient le texte “abc” 3. On veut écrire un programme roule qui fasse “rouler” un mot donné en argument de la ligne de commande, soit N fois si N est également spécifié sur la ligne de commande, soit jusqu’à ce que le mot revienne à son état d’origine si N n’est pas spécifié. Par exemple : batman 5 >roule roulant oulantr ulantro lantrou antroul ntroula troulan roulant batman 6 > batman 7 >roule roulant 2 oulantr ulantro batman 8 > Proposez une solution en C pour le programme roule. Exercice 5 La commande du affiche à l’écran la taille (en mega octets) du fichier donné en arguments : {batman} 2 >du exam.pdf 86 exam.pdf {batman} 3 > On souhaite écrire un fichier de commandes qui : 1. prend un paramètre entier N sur la ligne de commande ; 2. crée dans le répertoire courant deux nouveaux répertoires de nom Gros et et Petits ; 3. déplace dans le répertoire Gros tous les fichiers du répertoire courant dont la taille est supérieure ou égale à N et dans le répertoire Petits tous ceux dont la taille est strictement inférieure à N . Les répertoires qui se trouvent dans le répertoire courant sont laissés inchangés par cette commande. 1. Décrivez en quelques lignes une solution possible. Cette solution peut combiner l’utilisation de commandes existantes ainsi que des programmes C ou fichiers de commandes (dont vous préciserez les fonctionnalités). 2. Donnez la réalisation complète de votre solution. 8 Université Joseph Fourier Licence L1 “Sciences et Technologies” UE INF122 UE INF122-a – Examen du 21 mai 2007 On considère un format de fichier, noté IMG, destiné à stocker des images en noir et blanc. Une telle image est constituée d’une séquence de pixels, chaque pixel correspondant à un “point élémentaire” de l’image, coloré en “noir” ou en “blanc”. Un fichier IMG contient les informations suivantes : – un entier L, entre 0 et 1023, indiquant la largeur de l’image, en nombre de pixels ; – un entier H, entre 0 et 1023, indiquant la hauteur de l’image, en nombre de pixels ; – une séquence de L × H caractères, soit b (pour “blanc”), soit n (pour “noir”), indiquant la couleur de chaque pixel. Un exemple de tel fichier et de l’image associée sont donnés ci-dessous. contenu du fichier IMG : 4 2 nbbnnnbn Dans un fichier IMG toutes les informations sont écrites en ASCII (il s’agit donc d’un fichier “texte”). On dispose toutefois de deux commandes Unix : – compresser exemple.img lit en entrée le fichier IMG exemple.img et le remplace par un fichier de nom exemple.img.bin, au format binaire, dans lequel toutes les informations sont codées en binaire (en particulier la couleur de chaque pixel sera codée sur un seul bit). On notera ce nouveau format le format “IMG compressé”. – decompresser exemple.img.bin lit en entrée le fichier exemple.img.bin au format “IMG compressé” et affiche à l’écran, au format IMG, le texte correspondant à son contenu. Question 1 (2 points) 1. Quelle est la taille en octets d’un fichier IMG exemple.img contenant une image de 100 pixels de large et 100 pixels de haut ? 2. Quelle est la taille en octets du fichier exemple.img.bin produit par la commande compresser exemple.img ? 3. Ecrire un fichier de commandes de nom compresser tout.sh, tel que la commande compresser tout.sh Images ait pour effet : – de créer, s’il n’existe pas, un répertoire Archives dans le répertoire courant ; – de compresser tous les fichiers du répertoire Images dont le nom est suffixé par “.img” ; – puis de déplacer tous les fichiers du répertoire Images dont le nom est suffixé par “.img.bin” dans le répertoire Archives. Question 2 (3 points) On souhaite écrire un programme de nom affiche img tel que la commande affiche img exemple.img affiche à l’écran l’image contenue dans le fichier exemple.img. On dispose pour cela dans le répertoire courant d’un fichier source de nom affichage.c qui contient le code C des trois fonctions suivantes : – void ouvrirFenetre(int largeur, int hauteur) : ouvre une fenêtre graphique de fond blanc dont la taille (en pixels) est spécifiée par les 2 paramètres ; 9 – void afficherPixel(int i, int j) : affiche en noir le pixel d’abcisse i et d’ordonnée j dans la fenêtre graphique – void fermerFenetre() : ferme la fenêtre graphique 1. Ecrivez le programme principal (affiche img.c) du programme d’affichage en vous aidant au besoin du canevas proposé en annexe. On supposera que le fichier fourni en entrée respecte le format IMG. 2. Ecrivez un Makefile permettant de produire l’exécutable de nom affiche img. 3. On souhaite maintenant pouvoir appliquer ce programme d’affichage au fichier “IMG compressé” exemple.img.bin. Parmi les 2 séquences de commandes (a) et (b) ci-dessous, laquelle faut-il utiliser ? (a) decompresser exemple.img.bin | affiche img (b) decompresser exemple.img.bin > ! exemple.img affiche img exemple.img Indiquez comment votre programme affiche img.c doit être modifié pour que les utilisations de (a) et de (b) soient possibles. Annexe : canevas de programme pour la question 2.1 #include <stdio.h> #define BLANC 0 #define NOIR 1 int main (int argc, char *argv[]) { /* declaration des variables FILE *f ; - a completer */ /* verification du nmbre d’argument de la ligne de commande */ if (argc != ...) { /* a completer */ printf("nombre d’arguments incorrects\n") ; return 1 ; } ; /* ouverture du fichier fourni en argument de la ligne de commande */ f = fopen (...) ; /* a completer */ /* verification de la bonne ouverture du fichier */ if (f == ... ) /* a completer */ { printf("Impossible d’ouvrir le fichier %s en lecture\n", ...) ; /* a completer */ return 1; } else { /* traitement du fichier - a completer */ ... } ; return 0 ; } 10