Я работаю над проектом, и одна из задач, которые мне нужно выполнить, - передать строку, полученную из другого процесса, через трубку в другой процесс, но на этот раз я должны использовать очередь сообщений.System V Message Queues - получение сообщения, которое уже существует
Мне удалось узнать, как работает msgqueue
, и проделал простую рабочую программу, но дело в том, что оно работает при получении строки от stdin
до fgets
.
Мой вопрос:
Могу ли я передать строку, которая уже сохраненную в другой переменной (например char s[20] = "message test";
) в Mtext msgqueues?
Моя простая программа выглядит следующим образом:
#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;
}
Нужно ли использовать реализацию очереди сообщений System V? Очереди сообщений POSIX предоставляют несколько более чистый API. –
В любом случае, почему, по вашему мнению, возникла бы проблема с тем, что вы описали? Вы что-то читали в документах 'msgsnd()', что заставляет вас так думать? Вы * прочитали его документы, верно? –
Да, я должен использовать System V. Чтобы быть честным, мне было трудно понять описание руководства, поэтому я использовал какое-то интернет-руководство, чтобы понять, как он работает. По вашему вопросу: я пытался запустить его с чем-то вроде этого: 's символ [20] = "тест",' ' mbuf.string = * s;' Но это была ошибка во время компиляции с этими результатами: несовместимые типы при назначении типа «char [20]» из типа «char» – Cahir