System V Msg Queues auf Linux funktionieren nicht wie erwartet
-
23-08-2019 - |
Frage
Ich habe die folgende Anwendung, die ein Problem repliziert ich mit System v Nachrichtenwarteschlangen in einer größeren Anwendung mit bin. Grundsätzlich ist die Hauptfunktion einer Taste erzeugt, dann erzeugt eine Nachrichtenwarteschlange mit msgget (). Dann werden 3 Gabeln hervorgebracht, die jeweils mit einer anderen ID. jeder von ihnen läuft msgrcv mit einer anderen posative Nummer (so dass sie für verschiedene Nachrichten warten).
Haupt schläft dann für einige Sekunden eine Mitteilung an id sendet = 3. Jedoch es nicht der dritte Thread, der aufwacht, sondern eine andere Stelle. Dieser Code ist vollständig isoliert, so dass Sie selbst versuchen können, es heraus. Was ist mit diesem Code falsch?
#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);
}
Wenn ich für 2 warten, das bedeutet, Nachrichten, deren Struktur enthält eine mtype auf genau 2. 3 für 3 und so ein. Mein Bezugspunkt war in diesem Handbuch: http: //www.ecst .csuchico.edu / ~ beej / guide / IPC / mq.html . Kann jemand bitte helfen? (Sie müssen möglicherweise die ftok Codezeile ändern, um eine gültige Datei auf Ihrem eigenen Rechner-zu-Punkt erfolgreich zu testen). Ich bin mit Fedora 10 auf einem EeePC 1000H
Lösung
Ahh ich denke, es behoben haben. Es ist, weil ich ein int anstatt einem langen für das erste Element gesetzt in der Struktur für die „mtype“ verwendet wurde. vorbei in {1l, „Hallo“} statt und die Definition von i Wechsel zu scheint lange es behoben zu haben