System V消息队列 - 获取已存在的消息

时间:2017-01-06 20:19:50

标签: c linux message-queue

我一直在研究一个项目,其中一项任务就是将从另一个进程收到的字符串通过管道传递给另一个进程,但这次我必须使用一个消息队列。

我已经设法了解msgqueue如何运作并制作了一个简单的工作程序,但事实是,它在从stdinfgets接收字符串时有效。< / p>

我的问题是:

我可以传递已保存在其他变量中的字符串(例如 char s[20] = "message test";)到msgqueues mtext?

我的简单程序看起来像这样:

#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;
}

1 个答案:

答案 0 :(得分:0)

您的代码使用fgets()来填充缓冲区mbuf.string,并从stdin读取输入。您可以使用类似strcpy(mbuf.string, "message test")的内容,您可以在其中传入变量或使用硬编码字符串。

我建议使用POSIX消息队列API,因为不推荐使用System V API。