**************
Miniprojet mp4
**************
Groupe de News: epita.cours.c-unix.mini-projs
Date de rendu: mercredi 6 novembre 2002 - 08:00:42
Repertoire de rendu: ~/c/rendu/mp/mp4
Droits sur le rep et les exos: 700 sur ~/c/rendu/mp/ et ~/c/rendu/mp/mp4
700 pour les scripts tels que configure
et les répertoires
600 pour les fichiers
o+x ~/ ~/c/ ~/c/rendu/
==============================================================================
Partie 1
==============================================================================
------------------------------------------------------------------------------
Description
------------------------------------------------------------------------------
_________________________________________
/ /..//.-/--//-/...././/.--/.-/.-../.-./. \
\ .-/.../ /
-----------------------------------------
\
\ __ _
/oo\/ \
/(_X_) /
/ V-V ~--.__ /\
/ ~--~ /
(__/\_______________/
Vous devez réaliser deux éxécutables : sig_send et sig_receive, qui
communiqueront par signaux.
La communication est basée sur l'alphabet morse. La spécification de
cet alphabet se trouve dans le fichier
~acu/public/mp4/alphabet-morse.txt. Il s'agit de l´alphabet morse
standard auquel nous avons ajouté le '\n' et un caractère de fin de
message, représenté par '\E'.
Vous ne devez pas vous baser sur une temporisation pour synchroniser
vos signaux => chaque signal doit etre acquitté.
Vous avez droit à deux variables globales de type int pour le
programme sig_receive.
NetBSD 1.6 ne fournit pas de gestion des signaux suffisament avancée,
notamment il est impossible de récupérer le pid du processus ayant
lancé le signal. Il en découle que cette partie est uniquement à
faire sur sun et alpha.
------------------------------------------------------------------------------
Syscalls, fonctions et macros autorisees
------------------------------------------------------------------------------
malloc(3), free(3)
assert(3), perror(3), exit(3)
fopen(3), fread(3), fwrite(3), fgetc(3), fputc(3), fgets(3),
fseek(3), fclose(3)
getpid(2), kill(2)
sigaction(2), sigprocmask(2), sigpending(2), sigsuspend(2),
toutes les fonctions de sigsetops(3)
------------------------------------------------------------------------------
Interdictions
------------------------------------------------------------------------------
Tout ce qui n'est pas autorisé, donc notamment :
pause(3), *sleep(3), signal(3)
L'attente active (du genre while(1)) est aussi interdite.
------------------------------------------------------------------------------
Niveau 1
------------------------------------------------------------------------------
_________________________________________
/ /.-/..-//-.-./---/--/--/./-./-.-././--/ \
| ./-./-//./-/.-/../-//.-.././/...-/./.-. |
\ /-..././ /
-----------------------------------------
\
\ __ _
/..\/ \
/(_X_) /
/ U-U ~--.__ /\
/ ~--~ /
(__/\_______________/
------------------------
Synopsis: sig_send pid file
pid L'id du process sig_receive destinataire
file Le chemin du fichier contenant le message a transmettre. '-'
signifie que le message est à lire sur l'entrée standard.
------------------------
Synopsis: sig_receive file
file Fichier dans lequel le message transmis devra être
écrit. '-' signifie que le message doit être affiché sur la
sortie standard.
------------------------
Le message est composé uniquement de caractères [A-Z.,?\n]; c'est
leur transcription en morse qui est transmise au moyen des signaux
SIGUSR1, SIGUSR2 et SIGVTALRM, selon la correspondance suivante :
. => SIGUSR1
- => SIGUSR2
Entre deux lettres un signal SIGVTALRM est envoyé.
Pour transmettre un espace il y a donc deux SIGVTALRM consécutifs.
(la transcription en morse du caractère espace correspond à la chaîne vide)
sig_receive acquitte tout signal reçu par SIGUSR1 _ou_ SIGUSR2.
Le message lu sur l'entrée standard ne comporte pas de caractère de
fin de fichier, c'est à vous de le rajouter.
La communication doit commencer et se terminer par un SIGVTALRM.
------------------------
_________________________________________
/ /.../..-/../...//.---/.//..-/-././/---/ \
| -/.-/.-./.././/-.../---/..-/.-./.-././. |
\ //.-//.-../.-//-.../.././.-././/..--../ /
-----------------------------------------
\
\ __ _
/##\/ \
/(_*_) /
/ J J ~--.__ /\
/ ~--~ /
(__/\_______________/
Gestions des erreurs:
Seules les valeurs de retour doivent être respectées. Le choix des messages
est libre.
Voici les différents codes d'erreur:
- Erreur dans le format de la ligne de commande: 1
- Erreur dans la gestion du fichier
(droits invalides, caractère invalide, ...): 2
- Autres
(erreur système,
réception d'un code morse invalide, ...) 3
------------------------------------------------------------------------------
Niveau 2
------------------------------------------------------------------------------
_________________________________________
/ /..//..-./././.-..//.../--/.-/.-./-/./. \
| -.//.-.-.-/.-.-.-/.-.-.-//--/---/.-././ |
\ /.-/--./.-././.../.../../...-/./ /
-----------------------------------------
\
\ __ _
/\/\/ \
/(_X_) /
/ V-V ~--.__ /\
/ ~--~ /
(__/\_______________/
Les niveaux 2 et 3 consistent en plusieurs options, elles sont
indépendantes et vous pouvez implémenter celles que vous souhaitez.
Les premières consistent à :
- N'accepter dans sig_receive que les signaux qui proviennent du premier
processus à avoir envoyé un signal.
- Si un processus reçoit SIGINT ou SIGQUIT, les deux processus doivent
se terminer. Vous avez le droit d'utiliser une globale pour gérer cette
option.
Les autres options possibles sont :
------------------------
Synopsis: sig_send [-m] [-a FILE] [-c N] pid file
-m : Mode morse
Le message est donné en morse, avec les caractères '.', '-' et
'/' Il commence et finit par un '/', et ne finit pas par le
"caractère de fin de fichier" ('\E':...-.-)
-a FILE : Alphabet alternatif
La transcription en morse de chaque caractère du message est
donnée dans un fichier qui aura la syntaxe
suivante:
Alphabet = ( Lettre )*
Lettre = Caractère ':' Code '\n'
Caractère = un caractère ASCII affichable (ou non ... :) )
Code = [.-/]*
Vous devez gérer les séquences d'échappement suivantes :
'\E' : caractère de fin de fichier
'\n' : retour à la ligne
Les autres, en bonus.
Vous pouvez considérer qu'aucune lettre ne fera plus de 8
caractères en morse
-c N : Contôle d'intégrité
N bits de contrôle sont ajoutés au message.
Le contrôle est effectué sur _tout_ le message et est calculé
de la façon suivante:
(Somme des '.') mod (2^N), transmis en binaire après la
fin du message avec:
SIGUSR1 = 1
SIGUSR2 = 0
Ex
echo "HELLO WORLD" | sig_send 4242 -
=>
/...././.-../.-../---//.--/---/.-./.-../-../-.-.-./...-.-/
echo "HELLO WORLD" | sig_send 4242 -c 2 -
=>
/...././.-../.-../---//.--/---/.-./.-../-../-.-.-./...-.-/.-
------------------------
Synopsis: sig_receive [-m] [-a FILE] [-c N] file
Les options sont les mêmes que pour sig_send (si les option -c ou -a ne
sont pas activées avec le même paramètre dans les deux programmes,
cela génerera une erreur 3)
------------------------------------------------------------------------------
Niveau 3 (pour les warriors)
------------------------------------------------------------------------------
- Une méthode de contrôle d'intégrité plus performante
- Gestion d'un système de balises (passage en majuscules/minuscules,
texte clignotant, ..).
- Implémenter une reprise sur erreur.
- Faire le café.
Ces options ne seront pas testées par une moulinette.
==============================================================================
Partie 2
==============================================================================
------------------------------------------------------------------------------
Description
------------------------------------------------------------------------------
Dans cette partie, vous ne travaillez plus avec des signaux, mais
avec des IPC SysV.
Le principe reste le même : send doit transmettre un message à
receive, mais cette fois il n'est plus nécessaire que le message soit
transmis en morse.
------------------------------------------------------------------------------
Syscalls, fonctions et macros autorisees
------------------------------------------------------------------------------
malloc(3), free(3)
assert(3), perror(3), exit(3)
fopen(3), fread(3), fwrite(3), fgetc(3), fputc(3), fseek(3), fclose(3)
ftok(3)
getpid(2)
Niveau 1
msgctl(2), msgget(2), msgrcv(2), msgsnd(2)
Niveau 2
semctl(2), semget(2), semop(2),
shmat(2), shmctl(2), shmdt(2), shmget(2)
Pensez aussi à ipcs(1) et ipcrm(1)
------------------------------------------------------------------------------
Niveau 1
------------------------------------------------------------------------------
Recoder les fonctions de la partie 1, mais en utilisant des files de
messages.
------------------------
Synopsis: msg_send pid ... file
Identique à send de la partie 1, mais il y a plusieurs pid. Le
message doit être transmis à tous.
------------------------
Synopsis: msg_receive file
Identique à receive de la partie 1.
------------------------
Vous ne devez utiliser qu'une seule file de messages.
La clé associée à la file de messages doit être générée avec ftok.
Vous devez évidemment détruire la file de messages quand vous avez fini.
La taille du champ mtext ne doit pas depasser 256
(et la taille du fichier peut depasser 256).
------------------------------------------------------------------------------
Niveau 2
------------------------------------------------------------------------------
Encore identique, mais cette fois en utilisant de la mémoire partagée.
Synopsis: shm_send pid ... file
Synopsis: shm_receive file
Vous ne devez utiliser qu'une seule zone de mémoire partagée.
La clé doit être générée avec ftok.
Vous devez évidemment détruire la zone de mémoire partagée quand vous
avez fini.
==============================================================================
Modalités de rendu
==============================================================================
Le répertoire ~/c/rendu/mp/mp4 doit contenir le fichier AUTHORS, et 3
répertoires : sig, msg et shm (si vous n'avez pas tout fait, il est
inutile de créer des répertoires vides).
Chacun de ces répertoires doit contenir un configure, un Makefile, et
vos sources. Le Makefile doit générer deux éxécutables :
{sig,msg,shm}_{send,receive}
Vous devez générer une tarball de rendu, comme d'habitude,
avec la commande :
~acu/mbin/rendu.sh mp mp4
/...-.-/
|