我想要的是:Posix队列。接收和优先级
- > 1主进程创建4进程,接收来自子进程的消息并处理它们,打印接收到的内容。在NORMAL消息之前应该处理紧急消息。 当一个CRITICAL优先级消息到达时,父进程应该中断处理另一个消息,并且在处理完这些消息后,父进程可以继续处理NORMAL和URGENT优先级消息。
- >儿童只是将消息发送到父用随机优先
此外,CTRL + C被捕获,这样,当它发生时,孩子死了,家长等待,直到孩子们都做了,并然后,父母完成。
我的问题有两个:
- 如何处理的优先级我在上面解释的方式。
- 这可能是愚蠢的,但我仍然不知道为什么,但在父母代码中,当它收到一条消息时,它说:消息太长了,我无法解决它,不知道发生了什么。
这是我的代码:
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <time.h>
#include <signal.h>
#include <sys/wait.h>
#include <mqueue.h>
int main()
{
srand(time(NULL));
mqd_t mqd;
struct mq_attr atributos = {.mq_maxmsg = 10, .mq_msgsize = 50};
int i;
int pid;
int status;
int num_children = 4;
char buffer[atributos.mq_msgsize];
for (i = 0; i < num_children; i++)
{
if ((pid = fork() == 0))
{
srand(time(NULL));
int prio = rand() % 3;
char* msg = "Hi dude";
strncpy (buffer, msg, sizeof(buffer));
printf("%d\n",prio);
if ((mqd = mq_open("/queue.txt", O_CREAT | O_WRONLY, 0666, &atributos)) == -1)
{
perror("child mq_open");
exit(1);
}
if (mq_send(mqd, buffer, sizeof(buffer), prio) == -1)
{
perror("mq_send");
exit(1);
}
mq_close(mqd);
exit(0);
}
}
// parent
if ((mqd = mq_open("/queue.txt", O_CREAT | O_RDONLY, 0666, &atributos)) == -1)
{
perror("parent mq_open");
exit(1);
}
unsigned int priority;
for (int i = 0; i < num_children; i++)
{
if (mq_receive(mqd, buffer, sizeof(buffer)+1, &priority) == -1)
{
perror("mq_recieve");
exit(1);
}
char * buffer_priority=NULL;
if (priority==0) {
buffer_priority = "NORMAL";
} else if
(priority == 1) {
buffer_priority = "URGENT";
}
else if
(priority == 2) {
buffer_priority = "CRITICAL";
}
printf("Received (%s): %s\n", buffer_priority, buffer);
pid_t childpid;
if ((childpid = waitpid(-1, &status, 0)) > 0)
{
if (WIFEXITED(status))
printf("PID %d exited normally. Exit status: %d\n",
childpid, WEXITSTATUS(status));
else
if (WIFSTOPPED(status))
printf("PID %d was stopped by %d\n",
childpid, WSTOPSIG(status));
else
if (WIFSIGNALED(status))
printf("PID %d exited due to signal %d\n.",
childpid,
WTERMSIG(status));
}
}
mq_close(mqd);
}
此代码不会失败EMSGSIZE我。请发布实际上给您带来问题的实际代码。另外,您的size参数为'mq_receive'为一个字节太大,而传递给'mq_send'的大小应该是'strlen',而不是'sizeof'。 – pilcrow
用strlen()试过,没有+ 1.消息太久总是 – aDoN