2014-04-18 116 views
0

我想要的是:Posix队列。接收和优先级

- > 1主进程创建4进程,接收来自子进程的消息并处理它们,打印接收到的内容。在NORMAL消息之前应该处理紧急消息。 当一个CRITICAL优先级消息到达时,父进程应该中断处理另一个消息,并且在处理完这些消息后,父进程可以继续处理NORMAL和URGENT优先级消息。

- >儿童只是将消息发送到父用随机优先

此外,CTRL + C被捕获,这样,当它发生时,孩子死了,家长等待,直到孩子们都做了,并然后,父母完成。

我的问题有两个:

  1. 如何处理的优先级我在上面解释的方式。
  2. 这可能是愚蠢的,但我仍然不知道为什么,但在父母代码中,当它收到一条消息时,它说:消息太长了,我无法解决它,不知道发生了什么。

这是我的代码:

#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); 
} 
+0

此代码不会失败EMSGSIZE我。请发布实际上给您带来问题的实际代码。另外,您的size参数为'mq_receive'为一个字节太大,而传递给'mq_send'的大小应该是'strlen',而不是'sizeof'。 – pilcrow

+0

用strlen()试过,没有+ 1.消息太久总是 – aDoN

回答

2

这是可能的,因为你永远不,你是在不知不觉中使用之前创建一个工作unlink您的队列。如果旧队列的消息大小超过您传递给mq_receivemsg_len参数,那么这将解释您的“消息太长”(EMSGSIZE)错误。

尝试删除任何现有的队列,然后再运行该程序。如果它们尚未安装,您可以安装队列,像这样:

sudo mkdir /dev/mqueue 
sudo mount -t mqueue none /dev/mqueue 

然后,您可以执行像ls /dev/mqueuerm /dev/mqueue/queue.txt正常的文件操作。

(注:“queue.txt”是一个很可怕的名字这不是一个文本文件。)

+0

那么你解决了吗?如果是这样,我将删除这应该允许您删除您的问题。 – Duck

+0

我解决了这个问题的大小,(在接收信息太长),但我仍然不知道如何处理优先事项 – aDoN

+0

那么简短的答案是,posix队列已经做你想做的事情,但有关的东西中断处理在单线程程序中没有多大意义。 – Duck