Forum Programmation.c Pthread vs IPC sys V

Posté par  .
Étiquettes : aucune
0
18
mar.
2007
Bonjour,

Je développe actuellement un logiciel. J'ai besoin de traiter une pile / file de messages à envoyer à une partie serveur pour les traiter.

Je dois cependant attendre une confirmation de la réception du message pour le valider.

Première solution, j'utilise un thread qui tourne tout le long de mon programme et qui regarde sur une pile mise en static quelque part dans une fonction. Cette pile est remplie au fur et à mesure par mon programme. J'en arrive à devoir quelques variables statiques afin de ne pas "poutrer" tout mon code d'arguments dans tous les sens.

J'utilise donc :
int my_socket( void* data, int mask );
Qui contient 3 statiques : le fd de la socket, et les adresses.

void* my_netstack( void* data, int mask, ... );
Qui permet de remplir une pile dont le pointeur sur la tete est en statique.

les mask correspond a des commandes telles que INIT, FREE, CLOSE, PUSH, SEND ...

Cela me permet aussi un confort pour libérer l'espace mémoire lorsque le programme se prend un sigterm.

Je doute que cette solution soit élégante et bonne. Ca ressemble au final à des classes globales.

Deuxième solution :
Vu que les messages que je doit envoyer sont des chaines de caractères. Pourquoi ne pas faire deux programmes différents et utiliser les IPC et les files de messages, ( voir la mémoire partagée, je ne sais pas ...).

Mon expérience dans la programmation système est toute récente. Ce programme est un futur logiciel libre et je souhaite que le code soit le plus "propre" possible.
  • # Re:

    Posté par  . Évalué à 2.

    Si les deux programmes forme un tous, le plus simple est le multithreading.

    Mais tu devrais aussi regarder du côté de select(2) (man 2 select).

    > les mask correspond a des commandes telles que INIT, FREE, CLOSE, PUSH, SEND ...

    Utilise un enum, c'est plus "propre" et t'as la vérification du type, et gcc peut contrôler si tous les cas sont traités dans un switch().

    > int my_socket( void* data, int mask );

    void* !!?
    Fais une structure. Ce n'est pas compliqué.
    • [^] # Re: Re:

      Posté par  . Évalué à 1.

      Je vais finalement utiliser les IPC et faire un fork pour gérer le processus qui envoie les données. Les deux fils vont communiquer via la file de messages.

      Ca m'évite le passage en paramètre de divers élements : pile / fd de la socket / ...
      • [^] # Re: Re:

        Posté par  . Évalué à 2.

        > Ca m'évite le passage en paramètre de divers élements : pile / fd de la socket / ...

        En multi-thread tu n'as pas ce problème.
        Si la variable est globale, ben elle est globale pour tous les threads. Il y a tls (thread local storage) mais tu n'es pas obligé de l'utilisé et il n'est pas utilisé par défaut (il faut en faire la demande explicite).
        • [^] # Re: Re:

          Posté par  . Évalué à 1.

          Tu parles bien d'une variable globale, ou d'une variable globale spécifique à l'utilisation des threads ?

          Si tu veux pour le moment le but est de pouvoir ajouter des élements a une pile, alors qu'un deuxième process tourne en parrallèle et envoie chaque message de cette pile ( en la vidant ) via une socket.

          Pourquoi un deuxième process, c'est simplement que j'attend une réponse pour chaque envoie de message -> pour ne pas bloquer le reste du programme sur ces attentes.

          Encore merci pour ton aide.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.