!!! Cet article ne traite que de l'éxécution immédiat d'un programme !!!
Si je devais désigner l'une des fonctions GEM les plus mal documentées je pense que shel_write() aurait la palme! Je n'arriverais peut être pas a tout dire mais au moins je vais tacher sur le peu que je sais de ne pas dire de bétise.
Disons le tout de suite dans les systèmes multitache modernes, shel_write() est quasi obligatoire, j'avoue garder un certain attachement a Pexec() tant que je reste sur un système monotache. Pexec() possede pourtant un certain nombre d'extensions permettant entre autre sous Multitos de lancer un programme concurent au père, mais il faut le dire tout de suite nombre d'autres systèmes comme Magic, ne supportent pas ces extensions, alors dans ce cas shel_write() est obligatoire. De plus le Pexec(0,...) travaille differamment sous Mint ou Magic.
Pour simplifier pour les systèmes multitaches utilisez plutôt shel_write() et dans le cas contraire Pexec(), nous nous placerons dans ce cas de figure, les différentes documentations variant sur le role des paramètres je ne mettrais ici que dans les cas ou je suis sur du résultat.
int shel_write(int mode,int flag1,int flag2,*commande, *tail)
mode&0xFF = 1 : Lancement immédiat de la commande (les autres modes ne sont pas présentés ici)
si mode&0xFF00 != 0 alors commande pointe sur la structure SHELW :
typedef struct _shelw { char *newcmd; long psetlimit; long prenice; char *defdir; char *env; }
Nota: ce mode étendu n'est valide qu'a partir de l'AES 4.0 et n'a véritablement d'intérêt que sous environnement multitache, sinon Pexec() réalise l'éxécution de manière plus simple.
si mode&0x100 !=0 alors psetlimit la taille mémoire maximum valable pour le programme à lancer.
si mode&0x200 !=0 alors prenice contient la pirorité à accorder au programme à lancer.
si mode&0x400 !=0 alors *defdir pointe sur une chaine de caractères désignant le directory par défaut.
si mode&0x800 !=0 alors *env pointe sur une chaine de caractères désignant l'environnement.
*newcmd : chaine de caractere sur le programme à lancer.
flag1 : 1 -> Programme GEM, 0-> Programme TOS (ce qui permet sous certains environnements multitaches de lancer un programme de détournement de sortie standard écran comme VT52.PRG)
flag2 : 100 -> Lancement en parallèle du programme 101 -> lancement en single mode (le programme père est arrèté tant que le fils n'est pas ressorti) du programme.
Nota: si flag2 = 100 si le programme est lancé correctement alors shel_write() retourne le numéro d'application GEM du programme fils.
commande : déja décrit si mode&0xFF00 !=0 sinon commande pointe sur une chaine de caractères contenant le programme à lancer.
tail : Pointe sur la ligne de paramètres à passer au programme au départ, le 1er caractère désigne le nombre de caractères dans la commande, au dela de 255 on doit utiliser le passage de paramètres grâce à la méthode des arguments longs. Certains compilateurs possèdent des fonctions avancées qui se contentent juste de la commande (comme laserC mais pas GCC).
long Pexec(int mode, *name, *tail, *env)
mode = 1 : load and go (sous Multitos le programme est envoyé concourrament et sous Magic en single mode) il est donc préférable de ne pas utiliser Pexec sous système multitache. De plus le mode 100 (lancement en parallèle n'est pas supporté par Magic)
*name = pointeur sur le programme à éxécuter
*tail =idem shel_write()
*env = pointeur sur l'environnement, si NULL recopie de l'environnement du programme père.
WARNING: Tout programme lançant un autre programme sous système monotache doit obligatoirement fermer toutes se fenêtres avant l'éxécution sous peine au retour de plantages sévères et plus ou moins aléatoires.
La chaine de caractère pour l'environnement est constituée des variables d'environnement séparées par un 0, l'environnement est considéré comme terminé quand deux 0, sont trouvés à la suite.
Olivier Landemarre