Очереди сообщений System V в Linux не работают должным образом

StackOverflow https://stackoverflow.com/questions/390476

  •  23-08-2019
  •  | 
  •  

Вопрос

У меня есть следующее приложение, которое повторяет проблему, с которой я столкнулся в более крупном приложении с очередями сообщений системы v.по сути, основная функция генерирует ключ, а затем создает очередь сообщений с помощью msgget().Затем создаются 3 вилки, каждая со своим идентификатором.каждый из них запускает msgrcv с разным положительным номером (поэтому они ждут разных сообщений).

Затем Main спит на несколько секунд и отправляет сообщение на id = 3.Однако это не третий поток, который просыпается, но вместо этого другой.Этот код полностью изолирован, поэтому вы можете опробовать его самостоятельно.Что не так с этим кодом?

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/wait.h>

struct dummy_struct {
    long mtype;
    char message[255];
};

int msg_queue_id;
void recv_thread(int id);

int main(int argc, char **argv)
{
    int i;
    key_t key;
    struct dummy_struct dummy = { 3, "hello" };

    //create a unique key
    if (key = ftok("/mnt/mydocuments/code/sys_v_fork_test/main.c", 'a') == -1)
    {
        printf("ftok didn't work\n");
        exit(1);
    }

    //create the unix sys 5 message queue
    if ((msg_queue_id = msgget(key, 0644 | IPC_CREAT)) == -1)
    {
        printf("msgget failed\n");
        exit(1);
    }
    else
        printf("my message queue id: %i\n", msg_queue_id);

    //fork off multiple recievers
    for (i = 1; i < 4; i++) // <- NOTE: 1 -> 4
    {
        if (fork() == 0)
            recv_thread(i);
    }

    printf("sleeping\n");
    sleep(5);

    //wait a little then send a message

    printf("sending message\n");
    if (msgsnd(msg_queue_id, &dummy, sizeof(struct dummy_struct), 0) == -1)
    {
        printf("msgsnd failed\n");
    }
    printf("main thread exiting");
    _exit(0);
}

void recv_thread(int id)
{
    struct dummy_struct dummy;

    printf("recv_thread with id: %i\n", id);

    if (msgrcv(msg_queue_id, &dummy, sizeof(struct dummy_struct), id, 0) == -1)
        printf("error in msgrcv\n");
    else
        printf("thread %i got %s back\n", id, dummy.message);
}

Если я жду 2, это означает сообщения, структура которых содержит mtype, установленный в точно 2.3 по 3 и так один.Моей точкой отсчета было это руководство: http://www.ecst.csuchico.edu/~beej/guide/ipc/mq.html.Кто-нибудь может помочь, пожалуйста?(для успешного тестирования вам может потребоваться изменить строку кода ftok, чтобы она указывала на действительный файл на вашем компьютере).Я запускаю Fedora 10 на EeePC 1000H.

Это было полезно?

Решение

Ааа, думаю, я это исправил.Это потому, что я использовал int, а не long для первого набора элементов в структуре «mtype».вместо этого передать { 1l, "hello" } и изменить определение i на long, похоже, это исправило.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top