Examen de Systèmes I
Licence - Septembre 2000
Soit la suite de commandes suivantes :
1> cat < toto > titi
cat: les fichiers d'entrée et de résultat sont identiques
2> cat toto > titi
cat: les fichiers d'entrée et de résultat 'toto' sont identiques
3> cat f1
abcde
4> cat f2
abcde
5> diff f1 f2
6> cat < f1 > f2
7> cat f1 > f2
- 1.
- Quelle différence y a t'il entre les deux premières commandes ?
- 2.
- Que signifie exactement << sont identiques >> ?
- 3.
- Pourquoi les commandes 6 et 7 ne renvoient-elles pas un résultat
comparable ?
- 4.
- Écrivez un petit programme permettant de réaliser le test effectué par
la commande cat.
Soit la suite de commandes suivante :
> cat fichier
abcde
> echo fghij >> fichier
> cat fichier
abcdefghij
> rm fichier
rm: fichier non supprimé : Autorisation refusée
Pourquoi puis-je lire/modifier le fichier sans pouvoir le supprimer ?
Pour chaque question décrivez-soigneusement ce qui se passe.
/* p1 */
int main(int argc,char *argv[]) {
int i;
read(STDIN_FILENO,&i,sizeof(int));
write(STDOUT_FILENO,&i,sizeof(int));
exit(EXIT_SUCCESS);
}
/* p2 */
int main(int argc,char *argv[]) {
int i;
scanf("%d",&i);
write(STDOUT_FILENO,&i,sizeof(int));
exit(EXIT_SUCCESS);
}
- 1.
- Que produit l'exécution de p1 > fic sur l'entrée 12<espace>34<return> ?
- 2.
- Que produit l'exécution de p2 > fic sur l'entrée 12<espace>34<return> ?
- 3.
- Que se passe-t'il dans les deux cas si l'on remplace l'appel à write() par printf("%d",i) ?
Soient les deux programmes suivants :
/* cp1.c */
int main(int argc,char *argv[]) {
int d1, d2;
char c;
d1 = open(argv[1],O_RDONLY);
d2 = open(argv[2],O_WRONLY|O_CREAT|O_TRUNC,S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
while ( read(d1,&c,1)==1 ) write(d2,&c,1);
close(d1);
close(d2);
exit(EXIT_SUCCESS);
}
/* cp2.c */
int main(int argc,char *argv[]) {
FILE *d1, *d2;
char c;
d1 = fopen(argv[1],"r");
d2 = fopen(argv[2],"w+");
while ( fread(&c,1,1,d1)==1 ) fwrite(&c,1,1,d2);
fclose(d1);
fclose(d2);
exit(EXIT_SUCCESS);
}
Voici les temps d'exécution de chacun d'eux alors que le fichier f est
de taille 1752064 octets :
commande |
temps utilisateur |
temps système |
cp1 f g |
8,91s |
53,86s |
cp2 f g |
1,01s |
0,06s |
Pouvez-vous justifier ces mesures ?
Pourquoi la fonction int getchar() qui permet de lire un caractère sur
l'entrée standard renvoie-t'elle un entier ?
/* generateur.c */
int main(int argc,char *argv[]) {
int d;
long val;
srandom(getpid());
while (1) {
val = (int)random();
d = open("frandom",O_WRONLY);
write(d,&val,sizeof(val));
close(d);
}
}
- 1.
- Comment se comporte le programme generateur si la référence frandom est un fichier régulier ?
- 2.
- Même question si frandom est un tube nommé ?
On vous demande d'écrire une commande ou, prenant au moins un argument,
et qui détermine si les arguments correspondent à des commandes Unix
accessibles dans les chemins de la variable d'environnement PATH. Dans
le cas où il s'agit bien d'une telle commande ou doît afficher le chemin
d'accès complet comme dans l'exemple suivant :
> echo $PATH
.:/bin:/usr/bin:/usr/ucb:/usr/local/bin
> ou ls pwd
/bin/ls
/usr/bin/ls
/usr/ucb/ls
/bin/pwd
/usr/bin/pwd
> ou ou
./ou
Attention: ne sont considérés comme valides que les objets exécutables par
l'utilisateur appelant.
Jean-Baptiste Yunes
2000-09-18