Examen de Systèmes I
Licence - Septembre 2000

Exercice

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.

Exercice

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 ?

Exercice

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) ?

Exercice

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 ?

Exercice

Pourquoi la fonction int getchar() qui permet de lire un caractère sur l'entrée standard renvoie-t'elle un entier ?

Exercice

/* 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é ?

Exercice

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