mercredi 6 juillet 2011

Programmation Unix : Quelques solutions

Solution du paragraphe Remarque 3
      Mettre par exemple dans le fichier essai:
    exit 12
    Lancer essai.Rajouter au fichier essai la ligne :
    exit
    Vérifier qu'en relançant le script essai, on obtient bien la valeur 12.
     
     
Solution du paragraphe Remarque 4
      Mettre dans le fichier essai
    echo $1            en sachant qu'il suffit de l'appeler par essai <chaine de caractères>    
Solution du paragraphe Règle 3
     
    $ ls -l | wc -l équivalente à: $ ls -l > fichier $wc -l < fichier  
Solution du paragraphe Calculs Mathématiques
      Réalise la décomposition en facteurs premiers du nombre passé en paramètre.    
Solution du paragraphe Calculs Mathématiques
      Interpréter tout le fichier en le passant à bc parcat fonctions | bc -l    
Solution du paragraphe La structure while/do
     
    read ligne while test $? -eq 0 do echo $ligne read ligne done    
Solution du paragraphe La structure for/do
     
    for i in   '#'    '$'    '&'    '('    '-'    ';'     '>'    '<'    '['    ']' do date >${i}foo done    
Solution du paragraphe Un script simple
      Une solution parmi d'autres : taper dans le fichier essai:
    echo $1 if test $1 -eq 0      then echo fini else let temp=$1-1 essai $temp fi    
Solution du paragraphe Le script de la factorielle
      L'énoncé ne stipule pas que le script de la factorielle doit être récursif, cela tombe bien car ça ne me semble pas évident à réaliser a priori.Solution:
    let n=$1 let res=1 while test $n -ne 1     do let res=res*n     let n=$n-1 done echo $res    
Solution du paragraphe L'argument est-il numérique ?
     
    expr $1 + 0     1>/dev/null      2>/dev/null if test $? -eq 0      then echo Ok      else echo erreur fi    
Solution du paragraphe Unix et le langage C
      #include <stdio.h>/* écho de la ligne des arguments de le la ligne de commande */    main(int argc, char *argv[]) {      int i;      if (argc == 1) printf("pourriez-vous me donner quelques paramètres s.v.p ?!?\n");      else        for (i=1; i<argc; i++)          printf("%s%s",argv[i],(i<argc-1) ? " " : "");      printf("\n");      return 0; }    
Solution du paragraphe Les signaux sous Unix
      #include <signal.h>void Traite_Sig (int Numero) {     printf("Coucou, recu signal %d ! mais je l'ignore !\n", Numero);     signal (Numero,Traite_Sig);   /* !!!!!!!!! */ } main() {    int Nb_Sig ;     for (Nb_Sig = 1; Nb_Sig < NSIG ; Nb_Sig ++)     {       signal (Nb_Sig,Traite_Sig);     }     while(1); /* Attendre des signaux */ }    
Solution paragraphe Le cas de la fonction alarm
      Exercice 1#include <signal.h> #include <stdio.h> #include <unistd.h>   /* pour la fonction alarm */  int nombre; void traite_alarme() {   nombre=100;   printf("Le nombre entré vaut:%d\n",nombre);   printf("Veuillez entrer un AUTRE nombre:");   scanf ("%d",&nombre);   printf("Le NOUVEAU nombre entré vaut:%d\n",nombre); } main() {   alarm(3);   signal(SIGALRM,traite_alarme);   printf("Veuillez entrer un nombre:");   scanf ("%d",&nombre);   printf("Le nombre entré vaut:%d\n",nombre); } Exercice 2 #include <signal.h> #include <stdio.h> #include <unistd.h>   /* pour la fonction alarm */  int i='a';  int j; void traite_alarme() {   printf("caractère suivant: %c \n",i);   i++;   signal(SIGALRM,traite_alarme);   if (i<='z')  alarm(1);                  else exit(0);  } main() {   signal(SIGALRM,traite_alarme);   alarm(1);   while (1); }    
Solution du paragraphe Synchronisation du père et du fils
      Il suffit de rajouter la commande sleep 1 par exemple juste avant la  
    case (pid_t)0:      /* on est dans le processus fils */      printf("valeur de fork =%d ",pid);      printf("je suis le processus %d de père %d ",getpid(), getppid());      sleep 1      printf("fin du processus fils");      exit(0);
    Pour réaliser la synchronisation avec la commande wait, rajouter les deux lignes en italique:

    #include <stdlib.h> #include <stdio.h> main() { pid_t pid; int status; switch(pid=fork()){ case (pid_t)-1: perror("Création de processus");                 exit(2); case (pid_t)0:      /* on est dans le processus fils */      printf("valeur de fork =%d ",pid);      printf("je suis le processus %d de père %d ",getpid(), getppid());      sleep (1);      printf("fin du processus fils");      exit(0); default:      /* on est dans le processus père */      printf("valeur de fork = %d ",pid);      printf("je suis le processus %d de père %d",getpid(), getppid()); wait(&status);      printf("fin du processus père");    } }    
Solution du paragraphe Signaux et fork
      #include <stdio.h> #include <unistd.h> #include <signal.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h>main() {    pid_t pid;    int status;    switch(pid=fork()){       case -1: perror("Création de processus");         exit(2); break;       case 0: /* processus fils bouclant*/         while (1); break;       default:        /* on est dans le processus père */           sleep(5);           if (kill(pid,0)==-1)              printf ("FILS %d inexistant\n",pid);           else {              printf (" envoi de SIGUSR1 au processus %d\n",pid);              kill(pid,SIGUSR1);           }       } }    
Solution du paragraphe Rappels : les expressions régulières
      1. [a-zA-Z0-9] 2. [ a-zA-Z0-9] 3.  [a-z]*$ 4.  [0-9]+$    
Solution du paragraphe Exercices
      Exercice de substition de ``Z'' en ``a'':  {   gsub("Z","a",$0);        print $0    }Exercice 1: BEGIN {    print "Voici toutes les lignes qui contiennent la chaîne BO" } /BO/ { print FILENAME , FNR , $0 } Exercice 2: { print NR, $0 } Exercice 3: /.*[Ee].*1/ { print FILENAME , FNR , $0 } END { print "Vous avez vu les lignes qui contiennent un e "       print "puis des caractères quelconques puis un 1 " }

0 commentaires:

Enregistrer un commentaire