2017-01-06 2 views
-2

Я работаю над проектом, и одна из задач, которые мне нужно выполнить, - передать строку, полученную из другого процесса, через трубку в другой процесс, но на этот раз я должны использовать очередь сообщений.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; 
} 
+0

Нужно ли использовать реализацию очереди сообщений System V? Очереди сообщений POSIX предоставляют несколько более чистый API. –

+0

В любом случае, почему, по вашему мнению, возникла бы проблема с тем, что вы описали? Вы что-то читали в документах 'msgsnd()', что заставляет вас так думать? Вы * прочитали его документы, верно? –

+0

Да, я должен использовать System V. Чтобы быть честным, мне было трудно понять описание руководства, поэтому я использовал какое-то интернет-руководство, чтобы понять, как он работает. По вашему вопросу: я пытался запустить его с чем-то вроде этого: 's символ [20] = "тест",' ' mbuf.string = * s;' Но это была ошибка во время компиляции с этими результатами: несовместимые типы при назначении типа «char [20]» из типа «char» – Cahir

ответ

0

Ваш код использует fgets() для заполнения буфера mbuf.string с входом для чтения из стандартного ввода. Вместо этого вы можете использовать что-то вроде strcpy(mbuf.string, "message test"), где вы можете передать переменную или использовать строчную кодированную строку.

Я рекомендую использовать API-адрес очереди сообщений POSIX, поскольку API System V устарел.

+0

Да, но это не реагирует на реальный вопрос. –

+0

На самом деле это то, чего я надеялся достичь, извините, если я немного помутился, но это первый раз, когда я на самом деле прошу совета, и я не очень хорошо объясняю, что мне нужно. В любом случае, спасибо за помощь. Кстати, я должен беспокоиться об этом warrning? 'предупреждение: несовместимое неявное объявление встроенной функции 'str' – Cahir

+0

Убедитесь, что' #include 'находится в верхней части вашего файла. –

Смежные вопросы