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 par

    cat 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 " }

Daniel Schang
 

-= From guill.net =-