2017-01-06 1 views
-2

J'ai travaillé sur un projet et l'une des tâches que je dois faire est de passer la chaîne reçue d'un autre processus à travers un tuyau à un autre processus, mais cette fois je devez utiliser une file d'attente de messages.Système V Message Queues - Obtention d'un message déjà existant

J'ai réussi à apprendre comment msgqueue fonctionne et a fait un programme de travail simple mais, la chose est, il fonctionne lors de la réception d'une chaîne de stdin à fgets.

Ma question est:

Puis-je passer une chaîne qui est déjà enregistrée dans une autre variable (par exemple char s[20] = "message test";) au msgqueues textmult?

Mon programme simple ressemble à ça:

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/ipc.h> 
#include <sys/msg.h> 
#include <errno.h> 

struct msgbuf { 
    long mtype;   
    char string[20]; 
}; 
struct msgbuf mbuf; 
int open_queue(key_t keyval) { 
    int  qid; 

    if((qid = msgget(keyval, IPC_CREAT | 0660)) == -1) 
     return(-1); 

    return(qid); 
} 

int send_message(int qid){ 
    int result, size; 



    size = sizeof mbuf.string; 
    if((result = msgsnd(qid, &mbuf, size, 0)) == -1) 
      return(-1); 

    return(result); 
} 

int remove_queue(int qid){ 
    if(msgctl(qid, IPC_RMID, 0) == -1) 
     return(-1); 

    return(0); 
} 

int read_message(int qid, long type){ 
    int  result, size; 


    size = sizeof mbuf.string;  

    if((result = msgrcv(qid, &mbuf, size, type, 0)) == -1) 
     return(-1); 

    return(result); 
} 

int main(void){ 
    int qid; 
    key_t msgkey; 
    msgkey = ftok(".", 'm'); 
    if((qid = open_queue(msgkey)) == -1) { 
     perror("openErr"); 
     exit(1); 
    } 

    mbuf.mtype = 1; 
    fgets(mbuf.string, sizeof mbuf.string, stdin); 

    if((send_message(qid)) == -1) { 
     perror("sendErr"); 
     exit(1); 
    } 


    mbuf.mtype = 1;  

    if((read_message(qid, mbuf.mtype))== -1){ 
     perror("recERR"); 
     exit(1); 
    } 
    printf("Queue: %s\n", mbuf.string); 
    remove_queue(qid); 

    return 0; 
} 
+0

Utilisez-vous l'implémentation de la file d'attente de messages System V? Les files d'attente de messages POSIX fournissent une API plus propre. –

+0

Dans tous les cas, pourquoi supposez-vous qu'il y aurait un problème à faire ce que vous décrivez? Avez-vous lu quelque chose dans les docs de 'msgsnd()' qui vous fait penser cela? Vous * avez * lu * ses documents, n'est-ce pas? –

+0

Ouais, je dois utiliser le système V. Pour être honnête, j'ai eu du mal à comprendre la description du manuel, donc j'utilisais un guide Internet pour savoir comment ça fonctionnait. Selon votre question: je tente de l'exécuter avec quelque chose comme ça: 'char s [20] = "test", '' mbuf.string = * s; ' Mais il avait une erreur lors de la compilation avec ce résultat: types incompatibles lors de l'affectation au type 'char [20]' du type 'char' – Cahir

Répondre

0

Votre code utilise fgets() pour remplir le tampon mbuf.string avec entrée sur l'entrée standard. Vous pouvez utiliser quelque chose comme strcpy(mbuf.string, "message test") où vous pouvez passer une variable ou utiliser une chaîne codée en dur.

Je recommande d'utiliser l'API de file d'attente de messages POSIX car l'API System V est obsolète.

+0

Oui, mais cela ne répond pas à la question réelle. –

+0

En fait, c'est ce que j'espérais réaliser, désolé si je l'ai rendu un peu flou, mais c'est la première fois que je demande des conseils et que je ne suis pas bon pour expliquer ce dont j'ai besoin jusqu'à maintenant. En tout cas, merci de votre aide. En passant, devrais-je m'inquiéter de cette guerre? 'avertissement: déclaration implicite incompatible de la fonction intégrée 'str' – Cahir

+0

Assurez-vous de' #include 'en haut de votre fichier. –