Universit´ e Pierre et Marie Curie M1 - IRSI TP 1 Programmation unix El´ ements
Universit´ e Pierre et Marie Curie M1 - IRSI TP 1 Programmation unix El´ ements de correction Pr´ eparation du TP — Commandes de base du shell unix : ls, cd, pwd, mkdir, mv, rm, passwd, cp, cat, wc ; — Emploi du manuel unix (commande man) ; — Redirection des flux standards d’entr´ ee et de sortie ; — Processus, fork(), execl() ; — Utilisation des tubes (pipe) unix ordinaires et nomm´ es. Utilisation du shell Exercice 1 Connectez-vous ` a l’aide du login qui vous a ´ et´ e donn´ e. Ouvrez une fenˆ etre shell et tapez la commande login puis passwd et changez de mot de passe. D´ econnectez-vous (tapez exit) et reconnectez-vous (login). Exercice 2 D´ eplacez-vous ` a la racine du syst` eme et regardez les fichiers qui s’y trouvent. Allez dans le r´ epertoire /bin. Quels types de fichiers s’y trouvent ? reconnaissez-vous des noms ? Lesquels ? Mˆ eme question pour le r´ epertoire /dev, /lib puis /usr/lib. Pouvez-vous lire ces fichiers ? ´ ecrire dedans ? les ex´ ecuter ? Exercice 3 Tapez la commande man man. A quoi correspond-elle ? Utilisez la commande man avec l’ensemble des commandes vues dans ce TP. La commande man man appel le manuel sur la commande man qui explique donc le fonction- nement de cette commande. Exercice 4 Cr´ eez un fichier texte rep.txt qui contient la liste des fichiers de votre r´ epertoire courant. Re- copiez ce fichier dans un autre fichier rep2.txt en utilisant la commande cat et une redirection appropri´ ee. ls > rep.txt cat rep.txt > rep2.txt Exercice 5 Utilisez le manuel pour comprendre le traitement effectu´ e par la commande wc. Ecrivez ` a l’aide d’un pipe une commande qui compter les fichiers pr´ esents dans le r´ epertoire courant et qui affiche le r´ esultat sur le flux standard de sortie. La commande wc fichier.txt compte le nombre de mots, de lignes et de caract` eres dans le fichier donn´ e en argument. L’option -w limite la commande au nombre de mots. Ainsi wc -w fichier.txt affiche le nombre de mots pr´ esents dans le fichier. Pour compter le nombre de fichiers pr´ esents dans un r´ epertoire, il suffit d’utiliser les deux commandes ls et wc ` a l’aide d’un pipe. Le flux standard de sortie de la premi` ere commande est redirig´ e vers le flux standard d’entr´ ee de la deuxi` eme : ls | wc -w. Processus Exercice 6 (` a partir du shell) 1. Ouvrez une fenˆ etre shell et taper les commandes ps, ps -e, ps -f puis ps -ef. Que font ces commandes. Expliquez les r´ esultats obtenus. La commande ps permet de lister les processus en cours d’ex´ ecution. Sans arguments, ne sont list´ es que les processus ex´ ecut´ es ` a partir du shell en cours d’execution, lui compris. Le programme shell utilis´ e s’appelle bash. On doit donc noter la pr´ esence de deux processus en cours d’ex´ ecution : l’interpr´ eter bash et la commande ps elle mˆ eme. L’argument -e permet d’afficher tous les processus et l’argument -f ajoute des infor- mations concernant l’environnement d’ex´ ecution des processus. Les deux arguments peuvent ˆ etre cumul´ es par simple concat´ enation (-ef) 2. Ouvrez une deuxi` eme fenˆ etre shell. Tapez la commande top -d 1 et observez. Sur la premi` ere fenˆ etre, tapez la commande cat. Qu’observez vous sur la deuxi` eme ? Quittez le programme top et tapez la commande ps. Observez le r´ esultat obtenu en comparant avec le r´ esultat obtenu lorsque l’on tape la mˆ eme commande dans la premi` ere fenˆ etre shell. Le programme top permet de visualiser les processus en cours avec une p´ eriode de rafraichissement r´ egl´ ee ` a 1 seconde ( param` etre -d 1). La commande cat tap´ ee sans arguments sur la premi` ere fenˆ etre est en attente d’un fichier ` a afficher. On peut voir ce processus apparaˆ ıtre sur la deuxi` eme fenˆ etre via la commande top. Apr` es avoir quitt´ e le programme top, la commande ps montre que le terminal utilis´ e par la deuxi` eme fenˆ etre n’est pas le mˆ eme que celui de la premi` ere fenˆ etre (/dev/pts/1 au lieu de /dev/pts/0). 3. Dans la deuxi` eme fenˆ etre, ex´ ecutez l’interpr´ eteur (shell) bash, puis tapez ` a nouveau la commande ps. Interprettez le r´ esultat obtenu. Tapez exit puis tapez ` a nouveau ps. 2 Ex´ ecuter la commande bash revient ` a lancer un nouvel interpr´ eteur, que l’on voit bien apparaˆ ıtre avec la commande ps. Dans ce cas on n’utilise plus le premier qui reste en attente. La commande exit permet de quitter le deuxi` eme interpr´ eter pour retrouver le premier, ainsi que la commande ps nous le montre. 4. Des questions pr´ ec´ edentes, trouvez un moyen de lancer des commandes dans le deuxi` eme fenˆ etre dont les r´ esultats s’affichent dans la premi` ere fenˆ etre. Que se passe-t-il lorsque vous tapez une commande erron´ ee ou qui n’existe pas, par exemple coucou ? Ici nous devons donc rediriger le flux standard de sortie de l’interpr´ eteur vers la fenˆ etre de visualisation du premier shell. On en connaˆ ıt le device associ´ e qui est /dev/pts/0. Il suffit donc de taper la commande dans la deuxi` eme fenˆ etre bash > /dev/pts/0. Une fois cette commande lanc´ ee, tous les r´ esultats des commandes tap´ ees sur la deuxi` eme fenˆ etre sont affich´ es dans la premi` ere fenˆ etre. Lorsque l’on tape la com- mande coucou qui n’existe pas dans la deuxi` eme fenˆ etre, le message d’erreur continue d’apparaˆ ıtre dans la deuxi` eme fenˆ etre car le flux d’erreur standard n’a pas ´ et´ e redirig´ e. La commande compl` ete permettant de rediriger l’affichage et les erreurs serait bash > /dev/pts/0 2> /dev/pts/0. Exercice 7 (passage d’arguments) Ecrire un programme qui affiche son nom et les param` etres qui lui sont donn´ es en ligne de commande. Rappel : pour compiler un programme sous unix, la commande ` a utiliser est : cc -o prog prog.c o` u prog.c est le nom du fichier source et prog le nom donn´ e au programme ex´ ecutable. Corrig´ e : #include <stdio.h> int main( int argc, char *argv[] ) { // nom du programme (1er argument): printf( "Mon nom est: %s\n", argv[0] ); // arguments suivants: for ( int i=1; i<argc; i++ ) printf( "Argument %d: %s\n", i, argv[i] ); } Exercice 8 (fonctions d’E/S bas niveau sur des fichiers) Ecrire un programme qui copie un fichier dans un autre (voir cours). 3 Corrig´ e : #include <stdio.h> // fonctions E/S haut niveau #include <stdlib.h> #include <errno.h> // gestion des erreurs #include <sys/types.h> // d´ efinitions de types (ex: size_t) #include <fcntl.h> // ctrl des descripteurs de fichiers #include <unistd.h> // fonctions E/S bas niveau int main (int argc, char *argv[]) { int fd1, fd2, buffer[1024]; size_t n; // controle erreurs d’usage: if ( argc != 3 ) { printf ("usage:%s fichier_source fichier_destination\n", argv[0]); exit(1); } // ouverture fichier source a copier: fd1 = open(argv[1], O_RDONLY); if ( fd1 == -1 ) { perror( "open1" ); exit(1); } // ouverture fichier destination: fd2 = open( argv[2], O_WRONLY | O_TRUNC | O_CREAT ); if ( fd2 == -1 ) { perror( "open2" ); exit(1); } // copie: do { n = read( fd1, (void *) buffer, sizeof(buffer) ); if (n>0) if ( write( fd2, (void*) buffer, n ) != n ) perror ( "write" ); }while ( n>0 ); close( fd1 ); close( fd2 ); exit(0); } 4 Exercice 9 (fork) Ecrire un programme qui utilise une fourche pour cr´ eer un programme fils (fonction fork(). Le processus p` ere affichera ` a l’´ ecran le message ”je suis le p` ere de PID : XXXX”, tandis que que le processus fils affichera ”je suis le fils de PID : YYYY” (utiliser la fonction int getpid()). Corrig´ e : #include <stdio.h> #include <stdlib.h> #include <unistd.h> int main() { int pid; pid = fork(); if ( pid==-1 ) { perror("Exercice 9.\n"); exit(1); } else if ( pid==0) { // processus fils printf("Je suis le fils de PID %d\n", getpid() ); } else { printf("Je suis le Pere de PID %d\n", getpid() ); } } Exercice 10 (execl) La fonction execl() est un m´ ecanisme compl´ ementaire ` a la cr´ eation de processus implant´ e via la fonction fork() dont dispose le syst` eme Unix. Ecrire un programme appel´ e bonjour dont le code affiche ` a l’´ ecran la chaˆ ıne de caract` eres suivante : "bonjour". Ecrire puis ex´ ecuter le deuxi` eme programme suivant : #include <stdio.h> #include <unistd.h> int main() { printf("preambule du bonjour. \n"); execl("./bonjour", (char*) 0); printf("postambule du bonjour. \n"); } Que peut-on conclure ? 5 Corrig´ e (programme bonjour.c) : #include <stdio.h> int uploads/Industriel/ tp1-corrige 7 .pdf
Documents similaires










-
29
-
0
-
0
Licence et utilisation
Gratuit pour un usage personnel Attribution requise- Détails
- Publié le Jul 11, 2022
- Catégorie Industry / Industr...
- Langue French
- Taille du fichier 0.0897MB