3

我还有两个问题。1. 如何将消息队列名称作为命令行参数传递?例如我写道:

char src[50] , dest[50];
strcpy(src , "/");
strcpy(dest , argv[1]); // argv[1] is the name of message queue
strcat(dest , src);
char *msgqueue;
strcpy(msgqueue , dest);

但是,它会出现分段错误,当我更改为 char msgqueue[50] 时,会出现无效错误。

  1. 如何达到消息队列中的元素数量?我尝试了 m_attr.mq_msgsize 但我发现它没有给出答案。

我需要你的帮助,它们是完成我作业的最后一步!

感谢你所做的一切!

4

3 回答 3

1
char *msgqueue; //allocate memory and then copy
strcpy(msgqueue , dest);  

或者

  msgqueue=strdup(dest);    

或者

正如 Joachim Pileborg 所建议的那样

如果不需要更多修改,只需msgqueue = dest;

并且您想复制argv[1]到消息队列,然后在末尾添加“/”。

char *msgqueue=malloc(strlen(argv[1])+3); //one for null byte and another one for / for safe use one extra byte

strcpy(msgqueue,argv[1]);
strcat(msgqueue,"/");  
于 2013-10-22T06:56:29.087 回答
0

您应该为msgqueu. 例如

msgqueue = malloc(255);

并且在某个地方您应该释放此内存 请参阅C 中的内存分配

于 2013-10-22T07:03:32.990 回答
0

如何达到消息队列中的元素数量?我尝试了 m_attr.mq_msgsize 但我发现它没有给出答案。

我假设您的意思是当前队列中有多少消息。你用mq_getattr这个。您已经mq_getattr在您的服务器中使用,但您正在查看不同的字段。你想要mq_curmsgs

我假设您想查看此内容,因为您想确切地知道在您的服务器中要执行多少mq_receives操作,这样您就不会阻止接收永远不会到达的 msg。这是这样做的一种方法,但它不是万无一失的,因为在您的服务器检查有多少消息和您的客户端停止写入消息之间总是存在竞争条件。有替代方案(例如,用于轮询、定时接收和 mq_notify 的非阻塞队列),但对您的情况而言,最简单的方法是使用客户端发送的单独类型的消息,向服务器宣布“我完成了”。

于 2013-10-22T13:40:48.660 回答