home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Fred Fish Collection 1.5
/
ffcollection-1-5-1992-11.iso
/
ff_progs
/
miscutil
/
perefils.lzh
/
PERE-ET-FILS
/
README_FRANCAIS
< prev
next >
Wrap
Text File
|
1991-08-16
|
6KB
|
149 lines
************************************************************************
Ces fichiers sur les process et code reentrant doivent
etre distribues gratuitement a tout le monde.
Distribuez tous les fichiers ensemble sinon ce serait
inutilisable.
Lancement de cette demo:
CD ladirectorydecesfichiers
Pere Fils n (n est le nombre de process que vous voulez)
essayez 4 ou 15 ou 36 ou 300 si vous avez des Megs
Pour arreter tout ca:
- ecrire 'logoff' (sans les ') dans chaque fenetre
- le pere s'arrete tout seul apres le dernier fils
Pour compiler:
Prendre un Lattice,
LC1 -iINCLUDE: Pere
LC2 -v Pere
BLink FROM LIB:AStartup.obj+Pere.o TO Pere LIBRARY LIB:Amiga.lib+LC.lib VERBOSE NODEBUG
LC1 -iINCLUDE: Fils
LC2 -v Fils
BLink FROM LIB:StartProc.obj+Fils.o TO Fils LIBRARY LIB:Amiga.lib VERBOSE NODEBUG
Comment ca fonctionne ?
Le pere charge le code en memoire, puis lance autant de process
que l'on veut dessus. Le code est comme un corps inerte, le process
est l'etincelle qui le fait vivre.
Le pere ouvre 2 ports. Son process en a deja un que l'on peut
trouver (voir au debut du fils) mais on ne l'utilise pas, car le
DOS cause avec lui, et le seul truc qu'on peut avoir est un gourou
(87000004 = unexpected reveived packet).
Le 1er port sert a initialiser les fils et recevoir leur reponse
qui est soit OK soit un code erreur. Le pere change alors le
"reply port" dans son message et entame le dialogue avec le fils
qui lui repondra donc sur le 2eme port.
Le pere peut ensuite creer un autre message et initialiser un
autre fils en se servant du premier port.
Chaque fils detecte le message d'initialisation sur le port de
son process. Il se cree ensuite un port suplementaire et ne se
servira plus de celui du process (dans la structure Process). Avant
de repondre OK au pere, il place l'adresse du port qu'il a cree
dans le message qu'il retourne au pere (ReplyMsg) pour que celui-ci
sache a qui il s'adresse.
Comme il y a un message par fils, chaque message a en lui l'adresse
du port du fils qui l'a utilise. le pere n'a qu'a regarder qui lui
a ecris pour savoir a qui ecrire.
Les fils se comportent comme des terminaux, et le code qui les
gere est dans le pere. Il suffirait par exemple de faire memoriser
au pere les ports de tous ses fils, et de rajouter un peu de code,
pour avoir un serveur multivoies sur un ecran Amiga...
Si vous faites ca, n'utilisez pas des tableaux pour memoriser,
car ca limite le nombre de fils a la taille du tableau, mais
utilisez plutot les fonction de LIST de l'EXEC, qui sont tres
pratiques. Notez qu'elles permettent meme de faire des arborescences
en definissant des NODES dans des listes triees (par l'Exec) en
tant que HEADER d'autre listes...
Le startproc.obj:
C'est un astartup.obj modifie pour permettre de faire du code
reentrant. Certains diront qu'il n'y a qu'a enlever le startup, et
de terminer les process avec des RemTask(), mais c'est se priver
de 2 choses:
- la fonction exit() qui permet de terminer le process a
n'importe quel endroit du code, meme dans la 30eme fonction
imbriquee, car elle repositionne le pointeur de pile de ce
process avant de faire un RTS pour sortir definitivement.
- la possibilite de faire faire des AllocMem() par un process
car chaque fils doit desallouer la memoire qu'il a emprumte
au systeme avant de se terminer, ce que RemTask ne permet pas.
D'ou une possibilite interressante: il est fastidieux pour faire
du reentrant de devoir passer toutes les variable sous forme de
parametre, et de n'en avoir aucune de GLOBALE ni de STATIQUE. Une
alternative simple pour ne pas reecrire tous vos programmes est la
technique utilisee dans le fils, qui consiste a definir une structure
comportant toutes vos variables globales, et de faire une allocation
memoire a l'image de cette structure. Il ne reste plus qu'un seul
parametre a passer entre toutes les fonctions: l'adresse du bloc
memoire ou elles vont pouvoir ecrire et lire a loisir car il y aura
un bloc alloue par process.
En faisant communiquer les process entre eux par leur ports, il
serait meme possible qu'ils accedent tous a un meme ensemble de
donnees... Mais la il ne faut pas que l'un ecrive pendant que
l'autre lise, sinon SCRATCH! Il existe 2 solutions: quand un
process ecrit dans une telle zone partagee, il peut faire Forbid()
avant et Permit() apres, ou utiliser les Semaphores de l'Exec qui
permettraient aux process de se synchroniser en bloquant puis
liberant la zone a tour de role.
Amusez-vous bien, c'est magique de voir qu'une seule instruction
d'ouverture de fenetre permet d'en ouvrir des tas !
-------------------------------------------------------------------
Vous pouvez distribuer ces fichiers a condition que ce soit tous
ensemble:
proc.h le fichier include (structure message)
Pere.c le source
Fils.c le source
StartProc.asm le source
Pere l'executable
Fils l'executable
StartProc.obj l'executable
README ces explications
Vous pouvez aussi les traduire en anglais (mieux que moi) pour
les envoyer a Fred FISH.
Si amelioration et desir de partager, laisser un message a:
Jean-Michel FORGEAS, le SYSOP de FLam avec Alex LIVSHITS,
ou bien:
SYSOP, Serveur FLam, Tel: 47-58-76-15 (France)