Hi zusammen,
von der Uni aus sollen wir eine Aufgabe lösen, allerdings komme ich mit den Foliensätzen nicht weiter
die Aufgabe lauetet:
Schreibe ein C-Programm das zwei Prozesse erzeugt.
Die Kind-Prozesse sollen mit Message-Queues verbunden werden.
Der Elternprozess soll Zahlen von der Konsole einlesen können.
Diese werden an die Kindprozesse gesendet.
Ein Prozess soll die Zahlen addieren und der andere subtrahieren.
Die neuen Ergebnisse sollen nach jeder Berechnung ausgegeben werden
Kann mir eventuell jemand weiter helfen?
Frage zu Prozessprogrammierung
Re: Frage zu Prozessprogrammierung
Was hast Du bis hierhin selbst zustande bekommen?
It's as simple as that. And remember, Beethoven wrote his first symphony in C.
- Xin
- nur zu Besuch hier
- Beiträge: 8861
- Registriert: Fr Jul 04, 2008 11:10 pm
- Wohnort: /home/xin
- Kontaktdaten:
Re: Frage zu Prozessprogrammierung
Hmm... hatte die Frage doch schon heute früh gepostet... dachte ich...?
Die Frage lautete: Welches Betriebsystem?
Die Frage lautete: Welches Betriebsystem?
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Re: Frage zu Prozessprogrammierung
Zustande bekommen habe ich nicht wirklich viel, C ist sehr sehr kurz gekommen im Corona Semester und wir haben eigentlich lediglich Theorie besprochen. Mir Fehlt der gesamte Ansatz das Problem zu lösen.. leider.
Betriebssystem steht keines dabei. Denke wir dürfen das System frei wählen. Am liebsten auf Windows- Ich habe Windows 10 Version 2004
Betriebssystem steht keines dabei. Denke wir dürfen das System frei wählen. Am liebsten auf Windows- Ich habe Windows 10 Version 2004
- Xin
- nur zu Besuch hier
- Beiträge: 8861
- Registriert: Fr Jul 04, 2008 11:10 pm
- Wohnort: /home/xin
- Kontaktdaten:
Re: Frage zu Prozessprogrammierung
Auf Linux könnte ich besser auf fork() und queue() verweisen, da wusel ich gerade in der Ecke rum.
Auf Windows muss ich suchen und das geht gerade jetzt nicht.
Ansonsten würde ich die Frage gerne in der Form erweitern, dass zwischen Kind und Elternprozess kommuniziert wird. Ich hätte gerne, dass eine Anwendung auf die Fragen einer anderen Anwendung reagiert, das ganze bleibt nämlich dann beim Lesen des Child-Prozesses hängen. :-/
Ich hatte eine ähnliche Aufgabe im Studium, aber den Quellcode wohl nicht mehr.
Auf Windows muss ich suchen und das geht gerade jetzt nicht.
Ansonsten würde ich die Frage gerne in der Form erweitern, dass zwischen Kind und Elternprozess kommuniziert wird. Ich hätte gerne, dass eine Anwendung auf die Fragen einer anderen Anwendung reagiert, das ganze bleibt nämlich dann beim Lesen des Child-Prozesses hängen. :-/
Ich hatte eine ähnliche Aufgabe im Studium, aber den Quellcode wohl nicht mehr.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Re: Frage zu Prozessprogrammierung
Über Windows 10 Version 2004 kann man doch auf ein Linux Kernel zugreifen, so könnte ich über Ubuntu bspw. ein Terminal öffnen und dies laufen lassen.
Mehr zur Fragestellung haben wir leider nicht. Deshalb ist das System egal, schätze ich mal, was mich allerdings leider nicht weiter bringt. Dank dem Corona- Semester haben wir nicht ein einziges mal auf Linux programmiert, was das ganze für mich sehr erschwert.
Denn fork() und queue() waren auch meine einzigen Ansätze..
Vielen Dank trotzdem schonmal
Mehr zur Fragestellung haben wir leider nicht. Deshalb ist das System egal, schätze ich mal, was mich allerdings leider nicht weiter bringt. Dank dem Corona- Semester haben wir nicht ein einziges mal auf Linux programmiert, was das ganze für mich sehr erschwert.
Denn fork() und queue() waren auch meine einzigen Ansätze..
Vielen Dank trotzdem schonmal
Re: Frage zu Prozessprogrammierung
Als Beispiel eine sehr einfache Implementierung der Kommunikation zwischen Prozessen über eine Message-Queue unter Linux.
Für eine sinnvolle Implementierung fehlen noch ein paar Dinge, z.B. ist es nicht möglich die Kind-Prozesse aus dem Programm heraus zu beenden oder auf deren Fehler zu reagieren.
Code: Alles auswählen
// gcc main.c -lrt -Wall
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <mqueue.h>
#include <unistd.h>
const char MQ_NAME[] = "/somename"; // Muss mit / beginnen, siehe https://man7.org/linux/man-pages/man7/mq_overview.7.html
const long MQ_MAX_MESSAGES = 10;
const long MQ_MAX_MESSAGE_SIZE = 64;
int child_stuff(const unsigned int id)
{
printf("[%u] Started child\n", id);
mqd_t mq = mq_open(MQ_NAME, O_RDONLY);
if (mq == -1)
{
fprintf(stderr, "[%u] Error opening message queue: %s\n", id, strerror(errno));
return 1;
}
printf("[%u] Ready to receive\n", id);
char buffer[MQ_MAX_MESSAGE_SIZE];
while(1)
{
ssize_t bytes_received = mq_receive(mq, buffer, MQ_MAX_MESSAGE_SIZE, NULL);
if (bytes_received == -1)
{
fprintf(stderr, "[%u] Error receiving message: %s\n", id, strerror(errno));
return 1;
}
printf("[%u] %s\n", id, buffer);
}
return 0;
}
int parent_stuff()
{
char buffer[MQ_MAX_MESSAGE_SIZE];
struct mq_attr attr;
attr.mq_flags = 0;
attr.mq_maxmsg = MQ_MAX_MESSAGES;
attr.mq_msgsize = MQ_MAX_MESSAGE_SIZE;
attr.mq_curmsgs = 0;
mqd_t mq = mq_open(MQ_NAME, O_CREAT | O_WRONLY, S_IRUSR | S_IWUSR, &attr);
if (mq == -1)
{
fprintf(stderr, "Error creating message queue: %s\n", strerror(errno));
return 1;
}
while(1)
{
printf("Enter message:\n");
fgets(buffer, MQ_MAX_MESSAGE_SIZE, stdin);
buffer[strlen(buffer) - 1] = '\0';
printf("Sending message %s\n", buffer);
int bytes_sent = mq_send(mq, buffer, MQ_MAX_MESSAGE_SIZE, 0);
if (bytes_sent == -1)
{
fprintf(stderr, "Error sending message: %s\n", strerror(errno));
return 1;
}
}
}
int main()
{
const unsigned int NUM_CHILDREN = 2;
for (unsigned int i = 0; i < NUM_CHILDREN; i++)
{
pid_t child_pid = fork();
if (child_pid == 0)
return child_stuff(i + 1);
else
continue;
}
return parent_stuff();
}