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