نظام قوائم انتظار MSG النظام على Linux لا تعمل كما هو متوقع

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

  •  23-08-2019
  •  | 
  •  

سؤال

لدي التطبيق التالي الذي يكرر مشكلة أحصل عليه في تطبيق أكبر مع قوائم انتظار الرسائل V النظام. في الأساس، تقوم الدالة الرئيسية بإنشاء مفتاح، ثم ينشئ قائمة انتظار الرسائل مع MSGet (). ثم تم إلغاء 3 شوك، ولكل منها معرف مختلف. يتم تشغيل كل منها MSGRCV برقم استقرار مختلف (لذلك ينتظرون رسائل مختلفة).

الصفحة الرئيسية ثم ينام لبضع ثوان يرسل رسالة معرف = 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 للإشارة إلى ملف صالح على الجهاز الخاص بك لاختباره بنجاح). أنا أركض فيدورا 10 على eeepc 1000h

هل كانت مفيدة؟

المحلول

آه أعتقد أنني إصلاحه. ذلك لأنني كنت أستخدم INT INT بدلا من الطول للعضو الأول في هيكل "mtype". يمر في {1L، "Hello"} بدلا من ذلك وتغيير تعريف I لفترة طويلة، فقد تم إصلاحه

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top