POSIX очередь сообщений linux - PullRequest
0 голосов
/ 12 октября 2018

Я пытаюсь получить mq_receive () данные от отправителя. Mq_sender () работает, когда я сначала запускаю файл отправки. Но если я запускаю сначала, он блокируется, хотя после отправки данных в очередь..и прикрепил мой код ниже

    //sender
#include<stdio.h>
#include<sys/types.h>
#include<fcntl.h>
#include<sys/stat.h>
#include<mqueue.h>
#include<string.h>
#include<unistd.h>
#define NAME "/queone"
#define MAX_SIZE 1021
void main()
{
        int i;
        struct mq_attr attr;
        attr.mq_maxmsg = 10;
        attr.mq_msgsize = MAX_SIZE;
        int fd;
        char s[MAX_SIZE]="hello";
        int r1,r2;


                mq_unlink(NAME);
                perror("mq_unlink");
                fd=mq_open(NAME,O_CREAT | O_WRONLY ,0664,&attr);
                printf("fd=%d\n",fd);
                for(i=0;i<5;i++)
                r1=mq_send(fd,s,sizeof(s),0);
                printf("%d",r1);
}
//receiver
#include<stdio.h>
#include<sys/types.h>
#include<fcntl.h>
#include<sys/stat.h>
#include<mqueue.h>
#include<string.h>
#include<unistd.h>
#define NAME "/queone"
#define MAX_SIZE 1021
void main()
{
        struct mq_attr attr;
        attr.mq_maxmsg = 10;
        attr.mq_msgsize = MAX_SIZE;

        int fd,fd1,r;
        char s[MAX_SIZE];
                fd=mq_open(NAME,O_CREAT|O_RDONLY ,0664,&attr);
                perror("mq_open");
                printf("fd=%d\n",fd);
                mq_getattr(fd,&attr);
                printf("%d\n",attr.mq_curmsgs);
                printf("%d\n",attr.mq_msgsize);

                r=mq_receive(fd,s,sizeof(s),0);
                printf("%d",r);
                if(r==-1)
                perror("mq_receive");
                printf("%s\n",s);
                mq_unlink(NAME);


        }

как с этим справиться

1 Ответ

0 голосов
/ 13 октября 2018

Проблема в том, что вы безоговорочно вызываете mq_unlink в отправителе.Вот что происходит из-за этого:

  1. Получатель создает очередь сообщений
  2. Получатель прослушивает сообщение о нем
  3. Получатель переходит в спящий режим
  4. Отправитель удаляет очередь сообщений
  5. Отправитель создает новую очередь сообщений с тем же именем
  6. Отправитель отправляет сообщение в новую очередь сообщений

Поскольку очередь сообщений, в которую отправитель отправил сообщение, не является той, которую прослушивает получатель, получатель, очевидно, не получает сообщение.

...