Version sans JavaScript, en lecture seule : les ateliers, les quiz et l’exécution du code n’y sont pas. Version complète · Catalogue · Se connecter
Feuille d'exercices 5
Entrées-sorties Prévoir ce qu'écrit un programme selon que sa sortie va au terminal ou dans un fichier, écrire wc, tee et tail avec read, write et lseek, suivre les positions partagées, faire passer des entiers dans un tube. Chapitre 5.
Tous les programmes se compilent avec gcc -std=c11 -Wall -Wextra -Werror -D_POSIX_C_SOURCE=200809L. On n'utilise pas <stdio.h> pour lire ou écrire les données, seulement pour les messages d'erreur et l'affichage des résultats.
Exercice · Terminal ou fichier ?
#include <stdio.h>
#include <sys/wait.h>
#include <unistd.h>
int main(void )
{
printf("A\n" );
printf("B" );
write(STDOUT_FILENO, "C\n" , 2 );
if (fork() == 0 )
{
printf("D\n" );
return 0 ;
}
wait(NULL );
printf("E\n" );
return 0 ;
}
Qu'affiche ce programme quand on le lance dans un terminal ? Qu'y a-t-il dans f.txt après ./q1 > f.txt ? Où ajouter un seul appel pour que les deux sorties soient identiques et qu'aucune lettre ne soit répétée ?
Exercice · Compter
Écrire compte, qui lit son entrée standard jusqu'à la fin, et affiche le nombre d'octets et le nombre de lignes lus (le nombre de \n), comme wc -c -l. On lit par blocs de 4096 octets.
Vérifier sur son propre source : ./compte < compte.c, puis wc -c -l compte.c.
Exercice · Un tee
tee fichier recopie son entrée standard à la fois sur sa sortie standard et dans fichier. Écrire montee. Chaque bloc lu doit être écrit en entier aux deux endroits.
$ printf 'un\ndeux\n' | ./montee copie.txt | wc -l
2
$ cat copie.txt
un
deux
Exercice · Qui écrit où ?
Sans l'exécuter, donner le contenu des trois fichiers après ce programme. od -c p1.txt affiche un fichier octet par octet, pour vérifier.
#include <fcntl.h>
#include <unistd.h>
int main(void )
{
int a = open("p1.txt" , O_WRONLY | O_CREAT | O_TRUNC, 0666 );
int b = dup(a);
write(a, "bonjour" , 7 );
write(b, "!!" , 2 );
close(a);
close(b);
int c = open("p2.txt" , O_WRONLY | O_CREAT | O_TRUNC, 0666 );
int d = open("p2.txt" , O_WRONLY);
write(c, "bonjour" , 7 );
write(d, "!!" , 2 );
close(c);
close(d);
int e = open("p3.txt" , O_WRONLY | O_CREAT | O_TRUNC, 0666 );
write(e, "bonjour" , 7 );
lseek(e, 0 , SEEK_SET);
write(e, "B" , 1 );
lseek(e, 2 , SEEK_END);
write(e, "!" , 1 );
close(e);
return 0 ;
}
Exercice · Les derniers octets
Écrire queue n fichier, qui affiche les n derniers octets du fichier (tout le fichier s'il en a moins), comme tail -c n, sans lire le début du fichier.
Que se passe-t-il si l'on appelle echo x | ./queue 3 /dev/stdin ? Pourquoi ?