【问题标题】:System V Message Queues - getting message that already existsSystem V 消息队列 - 获取已经存在的消息
【发布时间】:2017-05-21 16:32:04
【问题描述】:

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

我设法了解了msgqueue 的工作原理并制作了一个简单的工作程序,但问题是,它在从stdinfgets 接收字符串时工作。

我的问题是:

我可以传递一个已经保存在其他变量中的字符串吗(例如 char s[20] = "message test"; ) 到 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。老实说,我很难理解手册的描述,所以我使用了一些互联网指南来了解它是如何工作的。根据您的问题:我试图用类似的东西运行它:char s[20] = "test";mbuf.string = *s; 但是在编译这些结果时出现错误:从类型'char'
  • 您不认为询问您实际遇到的错误比询问有关该错误的推测性解释的相关问题更好吗?
  • 嗯,我觉得还是问问自己想要达到的结果比较好,如果搞得有点纠结,抱歉。

标签: c linux message-queue


【解决方案1】:

您的代码使用fgets() 用从标准输入读取的输入填充缓冲区mbuf.string。您可以改为使用 strcpy(mbuf.string, "message test") 之类的东西,您可以在其中传入变量或使用硬编码字符串。

我建议使用 POSIX 消息队列 API,因为 System V API 已弃用。

【讨论】:

  • 是的,但这不是对实际问题的回应。
  • 其实,这是我希望达到的,如果我说的有点不清楚,对不起,但这是我第一次真正寻求建议,我不擅长解释什么我需要到目前为止。无论如何,谢谢你的帮助。顺便说一句,我应该担心这个警告吗? warning: incompatible implicit declaration of built-in function ‘str
  • 确保#include &lt;string.h&gt;位于文件顶部。
猜你喜欢
  • 2013-03-29
  • 2020-04-18
  • 2010-12-15
  • 1970-01-01
  • 2011-05-05
  • 2016-03-04
  • 2021-02-10
  • 2011-09-18
  • 1970-01-01
相关资源
最近更新 更多