Familienplanung

chickenwings

Erfahrenes Mitglied
Hallo Leute,

bin in der misslichen Lage ein Programm schreiben zu müssen, das einen Sohn und einen Enkel erstellt. Nun, das Erzeugen des Sohnes geht auch, nur bin ich mir nicht sicher, wie ich den Enkel erzeuge bzw. wie ich die Prozesse unterscheide. Mein Ansatz ist bisher folgender:
Code:
pid_t cpid; //aktuelle PID
pid_t enkel;
...
if ((cpid==fork())<0) {
        printf("Fehler, Sohn konnte n. erzeugt werden\n");
        exit(0);
}

if (cpid==0) {
        printf("Sohn mit ID %d erzeugt\n", cpid);
        if ((enkel=fork())<0) {
             printf("Fehler, Enkel konnte n. erzeugt werden\n");
             exit(0);
        }
        else {
             printf("Enkel mit ID %d erzeugt\n", enkel);
        }
}
...

nachdem ich das Programm ausgeführt habe, ergeben meine Ausgaben folgendes:
Sohn mit ID 0 erzeugt
Enkel mit ID 0 erzeugt
Enkel mit ID 3155 erzeugt

Das erste was ich nicht verstehe ist, warum nun zweimal ein Enkel erzeugt wird?
Desweiteren sollen in einer Schleife Sohn und Enkel über eine PIPE lesen und schreiben. Jedoch ist mir nicht klar, wie ich nun Vater, Sohn und Enkel unterscheide, zumal es einen Sohn mit einer PID=0 gibt und einen Enkel mit einer PID=0.
Hat jamand eine Idee, wie ich das am Besten bewerkstelligen kann?

gruss
chickenwings
 
Das erste was ich nicht verstehe ist, warum nun zweimal ein Enkel erzeugt wird?

Es werden keine 2 Enkel erzeugt in deinem Kode.
Die zweite Enkelausgabe ist eigentlich dein Kind, also nicht ein weitere Enkel sondern
dein Kindprozess mit der pid deines Enkels, da ja der Kindprozess nun selber zum
Vater geworden ist.
Wenn dus korrekt machen willst dann so:

C:
if ((cpid==fork())<0) {
        printf("Fehler, Sohn konnte n. erzeugt werden\n");
        exit(0);
}

if (cpid==0) {
        printf("Sohn mit ID %d erzeugt\n", cpid);
        if ((enkel=fork())<0) {
             printf("Fehler, Enkel konnte n. erzeugt werden\n");
             exit(0);
        }
        else if(enkel == 0) {
             printf("Enkel mit ID %d erzeugt\n", enkel);
        }
        else{
              //das ist der Kindprozess
        }
}

Zu deinem 2. Problem:

Öffne im Kindprozess 2 Pipes:
- eine zum Lesen
- die andre zum schreiben
Die Dateideskriptoren die du dabei bekommst werden beim erzeugen des Enkels
kopiert. Jetzt kannst du im Enkel und im Kind auf diese Deskriptoren Lese bzw
Schreiboperationen ausführen....

Gruß

RedWing
 
Hi RedWing,

habe es so realisiert:
Code:
if ((cpid=fork())<0){
		printf("FEHLER: Child-Prozess konnte nicht erzeugt werden!\n");
		exit(0);
	}
	
	// Child Prozess:
	if(cpid==0){
		printf("Kindprozess erzeugt.\n");	

		if ((cpid=fork())<0){
			printf("FEHLER: Enkel-Prozess konnte nicht erzeugt werden!\n");
			exit(0);
		}

		if(cpid==0){
			printf("Kindprozess erzeugt.\n");
			close(fd[1]); //Schliesse Schreibkanal
		}

		if(cpid>0){
			close(fd[0]); //Schließe Lesekanal
		}

		char msg[]="Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor...";

		while(1==1){
			//Enkelprozess: 
			if(cpid == 0){
				sleep(1);
				int i=read(fd[0],buf,256);
				printf("Enkel liest: %s(%i)\n",buf,i);
			}
			// Kindprozess:
			if(cpid!=0){
				write(fd[1],msg,sizeof(msg));
				printf("Kind schreibt: %s(%i)\n",msg,sizeof(msg));
				sleep(1);
		}
		fflush(stdout);	
	}

so funktioniert es soweit, nur daß ich mit STRG-C den Prozess (Prozesse) nicht abbrechen kann und mit kill -9 ran muss. Aber ich denke, das liegt daran, daß es jetzt zwei Prozesse sind, oder?

Danke erstmal
chickenwings
 
Hallo,
so funktioniert es soweit, nur daß ich mit STRG-C den Prozess (Prozesse) nicht abbrechen kann und mit kill -9 ran muss. Aber ich denke, das liegt daran, daß es jetzt zwei Prozesse sind, oder?
das liegt daran das sich dein Elternprozess schon wieder verabschiedet hat obwohl
Kind und Enkel noch weiter laufen. Sprich die Kind und Enkel sind verwaiste
Prozesse.

Du musst im Elternprozess auf das Kind warten...
Ungefähr so:
Code:
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/wait.h>


int main(){
    pid_t cpid;
    int fd[2];
    char buf[256];
    pipe(fd);
    if ((cpid=fork())<0){
        printf("FEHLER: Child-Prozess konnte nicht erzeugt werden!\n");
        exit(0);
    }
    //Kindprozess
    else if(cpid==0){
        printf("Kindprozess erzeugt.\n");
        char msg[]="Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor...";
        if((cpid=fork()) < 0){
            printf("FEHLER: Enkel-Prozess konnte nicht erzeugt werden!\n");
            exit(0);
        }
        //Enkelprozess
        else if(cpid == 0){
            printf("Enkelprozess erzeugt.\n");
            close(fd[0]); //Schließe Lesekanal
            while(1){
                sleep(1);
                write(fd[1],msg,sizeof(msg));
                printf("Enkel schreibt: %s(%i)\n",msg,sizeof(msg));
            }
        }
        //Kinprozess
        else{
            close(fd[1]); //Schliesse Schreibkanal
            while(1){
                int i=read(fd[0],buf,256);
                printf("Kind liest: %s(%i)\n",buf,i);
                sleep(1);
            }
        }
    }
    //Vaterprozess wartet auf sein Kindprozess damit dieser nicht verwaist
    else
        waitpid(cpid, NULL, 0);
    return 0;
}

//edit hab deinen code etwas modifiziert, sorry about that...
Gruß

RedWing
 
Zuletzt bearbeitet:
Zurück