Seite 1 von 1

Frage zu Prozessprogrammierung

Verfasst: Mo Sep 14, 2020 9:32 am
von derHabbig
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?

Re: Frage zu Prozessprogrammierung

Verfasst: Mo Sep 14, 2020 5:20 pm
von mfro
derHabbig hat geschrieben:
Mo Sep 14, 2020 9:32 am
Kann mir eventuell jemand weiter helfen?
Was hast Du bis hierhin selbst zustande bekommen?

Re: Frage zu Prozessprogrammierung

Verfasst: Mo Sep 14, 2020 10:24 pm
von Xin
Hmm... hatte die Frage doch schon heute früh gepostet... dachte ich...?

Die Frage lautete: Welches Betriebsystem?

Re: Frage zu Prozessprogrammierung

Verfasst: Di Sep 15, 2020 7:12 am
von derHabbig
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

Re: Frage zu Prozessprogrammierung

Verfasst: Di Sep 15, 2020 9:53 am
von Xin
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.

Re: Frage zu Prozessprogrammierung

Verfasst: Di Sep 15, 2020 10:00 am
von derHabbig
Ü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

Re: Frage zu Prozessprogrammierung

Verfasst: Mi Sep 16, 2020 12:03 pm
von nufan
Als Beispiel eine sehr einfache Implementierung der Kommunikation zwischen Prozessen über eine Message-Queue unter Linux.

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();
}
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.

Re: Frage zu Prozessprogrammierung

Verfasst: Fr Sep 18, 2020 6:17 pm
von derHabbig
Danke!