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

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top