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 */
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");
}
}
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
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 " }