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

Documents pareils