général
curriculum vitae
contact

CARDIWEB
2007
2006
2005

Etudes
les projets
les sites web
les exposés

liens
OTB World
EPITA
PCN
CARDIWEB

 
			**************
			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

 /...-.-/


 

 
 
     

| Copyright 2002 © OTB World Conception |
.:: version du site : v2.0 ::.