Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : Verwendung von Message Queues



Lupus84
27-06-2007, 11:57
Ich habe mal wieder eine Aufgabe gestellt bekommen und habe da einige Probleme! Erstmal die Aufgabe:
Ein Büro will als Dienst die Vermittlung von Fahrgemeinschaften einrichten, bei dem sich sowohl Fahrer mit eigenem PKW als auch Mitfahrer registrieren lassen können. Die einzelnen Registrierungen werden in eine Warteliste eingetragen, aus der sie in der Reihenfolge ihre Eingangs abgearbeitet werden.

Die Registrierung erfolgt mit dem Aufruf:

eintrag{-f|-m} Vorname Name

wobei -f für den Fahrer und -m für den Mitfahrer stehen.

Ein Serverprogramm, das im Hintergrund laufen soll arbeitet die Registrierungen, die an eine Message Queue gesandt wurden, ab und gibt jeweils dann, wenn sich sowohl ein Fahrer, als auch ein Mitfahrer registriert haben den folgenden Text auf dem Bildschirm aus:

Neue Fahrgemeinschaft
Fahrer: Vorname Name Mitfahrer: Vorname Name

Bei Aufruf des Programmes eintrag mit der Option -a soll der Abbruch des Serverprozesses erfolgen und die Message Queue, die für die Warteliste angelegt wurde, soll gelöscht werden.

Schreiben sie die beiden C-Programme eintrag.c und server.c! Führen sie eine Fehlerabfrage für den Erfolg des Anlegens der Message Queue, für die korrekte Anzahl der Argumente und für den Erfolg der Sende - und Leseoperation durch!

So viel erstmal zur Aufgabenstellung. Jetzt zu meinen beiden Programmen ... ich bekomme immer eine Fehlermeldung dass die Message Queue nicht angelegt werden konnte! Woran liegt es?


Eintrag.c :

#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/types.h>
#include <stdio.h>
#include <string.h>

int main(int argc, char* argv[])
{
int msgid, status;

if (argc != 4 && argc != 2)
{
printf("Aufruf: eintrag {-f|-m} vorname nachname\n");
printf(" oder: eintrag -a für Abbruch");
return -1;
}

struct msgbuf {
long id;
int term;
char vn[20];
char nn[20];
} msg_snd;

msgid = msgget(75, 0);

if (msgid < 0)
{
printf("Fehler beim Anlegen der Message Queue\n");
return -1;
}

if ( (strcmp(argv[1],"-a") == 0) && argc == 2)
{
msg_snd.id = 1;
msg_snd.term = 1;

status = msgsnd(msgid, &msg_snd, sizeof(msg_snd)-sizeof(long), 0);

if (status < 0)
{
printf("Fehler beim Senden\n");
return -1;
}
return 0;
}

if (argc == 4)
{

if ( strcmp(argv[1], "-f") == 0)
{
msg_snd.id = 1;
msg_snd.term = 0;
strncpy(msg_snd.vn, argv[2], 19);
strncpy(msg_snd.nn, argv[3], 19);

printf("Fahrer: %s %s\n",msg_snd.vn, msg_snd.nn);

status = msgsnd(msgid, &msg_snd, sizeof(msg_snd)-sizeof(long), 0);

if (status < 0)
{
printf("Fehler beim Senden\n");
return -1;
}
}

if ( strcmp(argv[1], "-m") == 0)
{
msg_snd.id = 2;
msg_snd.term = 0;
strncpy(msg_snd.vn, argv[2], 19);
strncpy(msg_snd.nn, argv[3], 19);

printf("Mitfahrer: %s %s\n",msg_snd.vn, msg_snd.nn);

status = msgsnd(msgid, &msg_snd, sizeof(msg_snd)-sizeof(long), 0);

if (status < 0)
{
printf("Fehler beim Senden\n");
return -1;
}
}
}
return 0;
}


Server.c

#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/types.h>
#include <stdio.h>
#include <string.h>

int main(void)
{
int msgid, status;

struct msgbuf {
long id;
int term;
char vn[20];
char nn[20];
} msg_rcvf, msg_rcvm;

msgid = msgget(75, IPC_CREAT|0777);

if (msgid < 0)
{
printf("Fehler beim Anlegen der Message Queue\n");
return -1;
}

printf("Server gestartet\n");

while(1)
{

status = msgrcv(msgid, &msg_rcvf, sizeof(msg_rcvf)-sizeof(long), 1, 0);

if (status < 0)
{
printf("Fehler beim Empfangen\n");
return -1;
}

if (msg_rcvf.term == 1)
{
printf("Server wurde beendet\n");
msgctl(msgid, IPC_RMID, 0);
return -1;
}

status = msgrcv(msgid, &msg_rcvm, sizeof(msg_rcvm)-sizeof(long), 2, 0);

if (status < 0)
{
printf("Fehler beim Empfangen\n");
return -1;
}

if (msg_rcvm.term == 1)
{
printf("Server wurde beendet\n");
msgctl(msgid, IPC_RMID, 0);
return -1;
}

printf("Fahrer: %s %s - Mitfahrer: %s %s\n",msg_rcvf.vn, msg_rcvf.nn, msg_rcvm.vn, msg_rcvm.nn);

}

return 0;
}

SebastianKN
02-07-2007, 19:00
was sagt denn perror?

vielleicht hilft Dir das weiter: http://users.actcom.co.il/~choo/lupg/tutorials/multi-process/multi-process.html#msgqueue_create