TD/TP3 Appels syst`eme

Transcription

TD/TP3 Appels syst`eme
Programmation Unix
Licence Informatique
Année 2015-2016
Semestre 4
TD/TP3
Appels système
1
Exercices de TD
1. Ecrire un programme C qui affiche 10000 fois ”bonjour” sur la sortie erreur puis qui affiche sur la sortie
standard le temps mis en seconde pour cet affichage.
2. En utilisant les E/S Unix, écrire un programme C qui fait saisir au clavier un nom de fichier, puis qui affiche
son contenu sur la sortie standard. Si l’ouverture du fichier a échoué, un message d’erreur s’affiche (utiliser
perror) et on recommence la saisie. On considère que le nom du fichier est de 50 caractères maximum.
Exemple :
$> ./a.out
Entrez le nom du fichier: /etc/toto
Ouverture du fichier: No such file or directory
Entrez le nom du fichier: /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
...
Votre programme traite-t-il correctement le caractère \n (retour chariot) qui est inclus avec la saisie?
3. Ecrire un programme C qui lit des caractères c sur l’entrée standard et les affiche sur la sortie standard
en leur appliquant le traitement suivant : si c’est un espace, il est remplacé par ; si c est un chiffre, il est
remplacé par le caractère * répété c fois. Exemple :
$> cat fic
ab cd2n3
$> ./a.out < fic
ab_cd**n***
4. Ecrire un programme C qui affiche (comme cat) un ou plusieurs fichiers dont les noms sont spécifiés en ligne
de commande. Si l’un des fichiers ne peut pas être ouvert, on affiche simplement un message avec perror
et on passe au suivant.
5. Ecrire une version simplifiée de la commande UNIX grep qui prend en arguments un motif et un nom de fichier
et qui affiche les lignes contenant ce motif. Utiliser la fonction strstr dont le man est donné ci-dessous :
SYNOPSIS
#include <string.h>
char *strstr (const char *meule_de_foin, const char *aiguille);
DESCRIPTION
La fonction strstr() cherche la première occurence
de la sous-chaı̂ne aiguille au sein de la chaı̂ne meule_de_foin.
VALEUR RENVOYÉE
La fonction strstr() renvoie un pointeur sur le début de la sous-chaı̂ne,
ou NULL si celle-ci n’est pas trouvée.
6. Ecrire une version simplifiée de la commande UNIX wc respectant le man suivant :
SYNOPSIS
wc [-cl] [fichier]
DESCRIPTION
wc compte le nombre de caractères et/ou de sauts de ligne dans
le fichier indiqué. Si aucun fichier n’est fourni, l’entrée
standard est utilisée.
EXEMPLES
$> wc -l /etc/passwd
30 /etc/passwd
$> wc -cl /etc/passwd
30 1303 /etc/passwd
$> cat /etc/passwd | wc -c
1303
1
Programmation Unix
Licence Informatique
Année 2015-2016
Semestre 4
7. Ecrire un programme C qui prend en argument un chemin relatif (ie qui ne commence pas par ”/”) et qui
vérifie que chaque élément du chemin est un répertoire (utiliser strtok, chdir et stat). Améliorer pour
traiter également le cas des chemins absolus.
$> cd
$> ./a.out ./.bashrc
. est bien un répertoire
Erreur: .bashrc n’est pas un répertoire
$> ./a.out /usr/include/sys/
usr est bien un répertoire
include est bien un répertoire
sys est bien un répertoire
8. Ecrire un programme C qui prend en argument un nom de fichier et des droits pour le propriétaire et qui
modifie les droits du fichier en utilisant l’appel système chmod décrit ci-dessous. Si le fichier n’existe pas, il
doit être créé.
SYNOPSIS
int chmod (const char *pathname, mode_t mode);
DESCRIPTION
chmod change le mode du fichier pathname.
Le mode est spécifié par un OU binaire ( | ) entre les éléments
suivants (les nombres sont en octal) :
S_IRUSR (00400) accès en lecture pour le propriétaire
S_IWUSR (00200) accès en écriture pour le propriétaire
S_IXUSR (00100) accès en exécution pour le propriétaire
...
VALEUR RENVOYÉE
chmod renvoie 0 s’il réussit, ou -1 en cas d’échec
Exemple d’exécution : $> ./a.out .bashrc r-x
9. Ecrire un programme C qui prend en argument une extension (par exemple ”jpg”) et qui affiche le nom des
fichiers du répertoire courant qui contiennent cette extension (on suppose que tous les fichiers sont de la
forme nom.extension)
2
Exercices de TP
1. Ecrire une nouvelle version de l’exercice 1 du TD en utilisant la fonction standard fprintf au lieu de write,
et comparer les temps d’exécution.
2. Ecrire une nouvelle version de l’exercice 3 du TD en fournissant les caractères à traiter directement sur la
ligne de commande (par exemple : ./a.out ab cd2n3). Comment traiter le caractère d’espacement dans ce
cas ?
Rappel : les chaı̂nes de caractères sont des tableaux, dont la longueur peut être obtenue par la fonction
strlen.
3. Ecrire une nouvelle version de l’exercice 5 du TD en recherchant seulement les mots exacts. On considère
qu’il n’y a pas de ponctuation et que 2 mots sont séparés par un espace.
Rappel : la fonction sprintf permet d’effectuer les mêmes actions que printf, mais place le résultat dans une
chaı̂ne de caractères.
2