AFD

Projet Systèmes II (Licence 2002-2003)

L'auteur de cette page est : Jean-Baptiste Yunes

Introduction et généralités

Il est demandé d'implanter un système d'appel de fonctions inter-processus en utilisant les fonctionnalités POSIX vues en cours.

Ce projet devra être:

  1. écrit en langage C,
  2. exécutable le jour de la soutenance sur les machines d'enseignement,
  3. réalisé par groupe d'au plus trois étudiants,
  4. accompagné d'un rapport devant être remis au début de la soutenance.

Description

L'idée est de permettre aux applications de faire appel à des fonctions externes au code de l'application et dont l'exécution est confiée à des processus spécifiques.

La réalisation du mécanisme devra reposer sur un modèle client/serveur dans lequel: le client enverra une requête d'appel d'une fonction particulière (avec transmission d'arguments éventuels) auprès du serveur, lequel délèguera le calcul et la transmission du résultat à un processus (de service) dédié.

Appel d'une fonction externe

Un tel appel aura pour prototype:
int appel_externe(const char *fonction, int type, void *retour, ... /* int type, void *arg */, NULL );

Où:

fonction
désigne l'identificateur externe (le nom) de la fonction;
type
définit le type C de l'argument qui suit;
retour ou arg
définit l'adresse à laquelle on trouvera en retour de l'appel la valeur de retour de la fonction et à l'appel la valeur des arguments éventuels.

Les différents types supportés sont les suivants:

typetype CCommentaire
TYPE_VOIDvoidne peut apparaître que pour la valeur de retour
TYPE_INTint *
TYPE_STRINGchar *ne peut apparaître comme valeur de retour

Ainsi un appel à une fonction d'addition de deux nombres entiers pourraît prendre la forme suivante:

int i, j , k, r;
// k = j+i;
r = appel_externe("plus",TYPE_INT,&k,TYPE_INT,&j,TYPE_INT,&i,NULL);

La valeur de retour de la fonction appel_externe représente la condition de terminaison de l'appel. On trouvera entre autres:

valeurSémantique
APPEL_OKTout s'est correctement déroulé
FONCTION_INCONNUELa fonction demandée n'est pas disponible
MAUVAIS_ARGUMENTSUn problème avec les arguments a été détecté (type, nombre)
PAS_DE_REPONSELa fonction externe ne répond pas dans le délai imparti (5 secondes)

Processus dédié

Comme nous l'avons déjà indiqué un processus dédié réalise effectivement le calcul d'une (ou plusieurs) fonction(s) particulière(s). Il reçoit sur son entrée standard le nom de la fonction à exécuter ainsi que ses arguments sérialisés par la fonction appel_externe et écrit sur sa sortie standard la sérialisation du résultat.

La sérialisation des arguments consiste en le codage suivant:

typecodageExemple
TYPE_VOID0x00
TYPE_INT0x01, suivi par la longueur du tableau de caractère qui suit codée sur 1 octet, tableau représentant le codage alphanumérique décimal de l'entierL'entier 123 est sérialisé en: 0x01, 0x03, '1', '2', '3'
TYPE_STRING0x02, suivi par la longueur du tableau de caractère qui suit codée sur 1 octet, tableau représentant la chaîne (caractère nul non compris!)La chaîne "abc" est sérialisé en: 0x02, 0x03, 'a', 'b', 'c'

Comme nous le verrons un peu plus loin, à son lancement depuis un terminal et avec des arguments appropriés un tel processus s'enregistre ou supprime son enregistrement auprès du serveur d'appel en déclarant ou retirant l'ensemble des fonctions qu'il désire ou ne désire plus réaliser.

Le serveur d'appel

Point névralgique du système il vérifie puis délègue les appels.

À la réception d'un appel de fonction le serveur vérifie qu'une fonction correspondant à ce qui est demandé a été enregistrée. En cas d'échec une erreur est renvoyée au client.

En cas de succès, un processus de service est créé et les données d'appel lui sont alors transmises sur son entrée standard.

La réalisation

Comme d'habitude il est recommandé de procéder avec précautions; et surtout de commencer par réfléchir. Les choix sont nombreux et notamment en ce qui concerne la communication entre les divers processus. Les divers protocoles ne sont pas fixés seule le format de sérialisation des données l'est, vous devez donc définir les divers protocoles. Le rapport devra en particulier détailer tout cela.