Communication inter processus sous linux

Communication inter processus sous linux - C++ - Programmation

Marsh Posté le 24-07-2002 à 15:58:02    

Hop
 
Je cherche à faire ça:
 
un 1er thread envoie des messages dans une file de messages. Il envoie cette structure:
 
struct trigctx {
   struct libnet_ip_hdr ip ;
   char lpfound [1024] ;
   time_t when ;
}
 
Le 2 thread regarde régulièrement dans la file de messages s'il y a un message, et le décortique pour voir s'il correspond à ce dont il a besoin. Il regarde avec IPC_NOWAIT en flag pour pas attendre qu'un message soit là.
Pb: un seg fault.
 

Code :
  1. Envoi du message:
  2. déclaré:
  3. struct trigctx {
  4.    struct libnet_ip_hdr ip ;
  5.    char lpfound [1024] ;
  6.    time_t when ;
  7. } ;
  8. struct trigctx * context ;
  9. Puis, pour l'envoi du message:
  10. if (idmq = msgget (MSGQUEUE, 0) == -1)
  11.    perror ("Cannot link to message queue\n" ) ;
  12. else
  13. {
  14.    context -> ip = (struct libnet_ip_hdr) *ip ;
  15.    context -> when = time(NULL) ;
  16.    strcpy (context -> lpfound, obuf) ;  // obuf est une chaine, évidemment
  17.    msgsnd (idmq, (void *) context, sizeof (context), IPC_NOWAIT) ;
  18. }


Code :
  1. Lecture du message, dans l'autre thread. Même déclarations.
  2. if (msgrcv (idmq, (struct trigctx *) context, 1000, 0, IPC_NOWAIT) == -1)
  3.    perror ("Cannot retreive info" ) ;
  4. }
  5. else
  6. {
  7.    if ((ctx->ip_src == context->ip.ip_src.s_addr) && (ctx -> ip_dst == context->ip.ip_dst.s_addr) && ((context -> ip.ip_p == ctx -> p_src) || (context ->ip.ip_p == ctx->p_dst)) && (time(NULL) - context->when < 5))
  8.    {
  9.       strcpy (ctx->user, context->lpfound) ;
  10.       printf ("lpfound: %s\n", context->lpfound) ;
  11.    }
  12. }


 
ctx est un struct ctx_t *, et cette structure contient entre autre:
 
u_long ip_src ; // ip source
u_long ip_dst ; // ip dest
u_short p_src ; // port source
u_short p_dst ; // port dest
char user [STRING_NAME_SIZE+1] ; // nom de l'utilisateur
 
Une idée?


Message édité par coldfire le 24-07-2002 à 15:59:15
Reply

Marsh Posté le 24-07-2002 à 15:58:02   

Reply

Marsh Posté le 25-07-2002 à 11:53:40    

personne?

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed