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;
}
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. –
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? –
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