C语言 消息队列名称和消息队列大小



我还有两个问题。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,但我看到它没有给出答案。

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

谢谢大家!

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

  msgqueue=strdup(dest);    

正如约阿希姆·皮勒堡所建议的那样

如果不需要更多修改,只需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,"/");  

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

msgqueue = malloc(255);

和 som 你应该在哪里释放这个内存请参阅有关 C 语言中的内存分配

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

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

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

最新更新