MessageQueue名称和消息队列大小

时间:2013-10-22 06:54:25

标签: c linux posix

我还有两个问题。 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,但我发现它没有给出答案。
  2. 我需要你的帮助,请完成我的作业!

    谢谢大家!

3 个答案:

答案 0 :(得分: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,"/");  

答案 1 :(得分:0)

您应该为msgqueu分配内存。例如

msgqueue = malloc(255);

并且你应该释放这个记忆 请参阅memory allocation in C

答案 2 :(得分:0)

  

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

我假设您的意思是队列中当前有多少条消息。您可以使用mq_getattr。您已在服务器中使用mq_getattr,但您正在查看其他字段。你想要mq_curmsgs

我假设您要查看此内容,因为您想确切知道服务器中要执行多少mq_receives,这样就不会阻止接收到永远不会到达的消息。这是这样做的一种方式,但它不是万无一失的,因为在服务器检查有多少消息和客户端停止写消息之间总是存在竞争条件。还有其他选择(例如,用于轮询的非阻塞队列,定时接收和mq_notify),但对于您的情况最简单的方法是使用客户端发送的单独消息,向服务器发送“我已完成”。 / p>