نظام قوائم انتظار MSG النظام على Linux لا تعمل كما هو متوقع
-
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 لفترة طويلة، فقد تم إصلاحه