Frage zu Prozessprogrammierung

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
derHabbig
Beiträge: 5
Registriert: Mo Sep 14, 2020 9:29 am

Frage zu Prozessprogrammierung

Beitrag von derHabbig » Mo Sep 14, 2020 9:32 am

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?

mfro
Beiträge: 337
Registriert: Mi Jan 16, 2013 4:58 pm

Re: Frage zu Prozessprogrammierung

Beitrag von mfro » Mo Sep 14, 2020 5:20 pm

derHabbig hat geschrieben:
Mo Sep 14, 2020 9:32 am
Kann mir eventuell jemand weiter helfen?
Was hast Du bis hierhin selbst zustande bekommen?
It's as simple as that. And remember, Beethoven wrote his first symphony in C.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8615
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Frage zu Prozessprogrammierung

Beitrag von Xin » Mo Sep 14, 2020 10:24 pm

Hmm... hatte die Frage doch schon heute früh gepostet... dachte ich...?

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.

derHabbig
Beiträge: 5
Registriert: Mo Sep 14, 2020 9:29 am

Re: Frage zu Prozessprogrammierung

Beitrag von derHabbig » Di Sep 15, 2020 7:12 am

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

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8615
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Frage zu Prozessprogrammierung

Beitrag von Xin » Di Sep 15, 2020 9:53 am

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.
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.

derHabbig
Beiträge: 5
Registriert: Mo Sep 14, 2020 9:29 am

Re: Frage zu Prozessprogrammierung

Beitrag von derHabbig » Di Sep 15, 2020 10:00 am

Ü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

nufan
Wiki-Moderator
Beiträge: 2488
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Frage zu Prozessprogrammierung

Beitrag von nufan » Mi Sep 16, 2020 12:03 pm

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.

derHabbig
Beiträge: 5
Registriert: Mo Sep 14, 2020 9:29 am

Re: Frage zu Prozessprogrammierung

Beitrag von derHabbig » Fr Sep 18, 2020 6:17 pm

Danke!

Antworten