Geforkter Prozess laesst mich keine Eingabe taetigen

musiKk

musiKk

Dr. Strangelove
Hallo, mein Sorgenkind, die Standardeingabe, aergert mich mal wieder aufs schlimmste.

Grob gesagt moechte ich erstmal einen Kind-Prozess erstellen und in diesem eine Eingabe taetigen koennen. Natuerlich ist das bei weitem nicht alles, aber da ich nicht einmal das hinbekomme, wollte ich das erstmal klaeren.

Mein Hauptprogramm sieht so aus: (main.c)
Code:
#include <stdio.h>
#include <signal.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>

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

	char filename[50];
	printf("filename: ");
	fgets(filename, 50, stdin);
	filename[strlen(filename)-1] = '\0';	//remove trailing \n
	printf("filename: %s\nlength: %d\n", filename, strlen(filename));
	
	char* child2_argv[3];
	child2_argv[0] = "child2\0";
	child2_argv[1] = filename;
	child2_argv[2] = NULL;
	
	pid_t child1, child2;
	
	// TODO: child1
	
	child2 = fork();
	switch (child2) {
		case -1:
			perror("fork");
			exit(1);
			break;
		case 0:
			execv("child2", child2_argv);
			perror("execv");
			exit(1);
			break;
	}

}

Mein Kind so: (child2.c)

Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define Fflush() while(getchar() != '\n')

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

	printf("Enter chars:\n");

	char c = fgetc(stdin);
	printf("%c\n", c);
	printf("Finished\n");
	
	fclose(fp);
	
}
Noch sehr sinnlos das Kind, ich weiss...

Folgendes Problem: Wenn ich das Kind alleine in der Konsole starte, laesst es mich eine Eingabe machen und gibt diese auch korrekt aus. Starte ich allerdings das Hauptprogramm, wird die Eingabe uebersprungen. Immer. Egal, ob es cin, getchar, scanf, fgets, ... ist. Auch ein fflush(stdin) vorher brachte nichts.

Woran koennte das liegen? :/

Vielen Dank schonmal fuer Antworten.

edit: Wers braucht btw noch: SunOS 5.8 mit gcc 3.4.2.
 
Hi!

Nach etwas herumprobieren hab ich den Fehler gefunden:

Der Vaterprozess beendet sich ohne auf seinen Sohn zu warten und der Sohn verliert damit den Zugriff auf stdin, da dies über den Vater läuft.

Füge mal am Ende des Vater-Programms folgende Zeile ein:
Code:
wait(NULL);
und erweitere die include Anweisungen um:
Code:
#include <sys/wait.h>

Für weitere Infos siehe http://www.pronix.de/pronix-155.html.

Gruß,
Philip
 
Omg. Furchtbarer Fehler. Zu fruehes Testen kann also auch schaedlich sein, normalerweise habe ich immer auf die Kinder gewartet, nur dieses Mal war ich wohl zu hektisch.

Vielen Dank. :)
 

Ähnliche Themen

Unix Webserver mit HTML Seite erstellen

Prozesskommunikation mit PIPES - wie funktioniert das?

Ausführbare C-Datei von Mac OS auf Embedded Linux ausführen

Aufgabe in C

C HTTP request

Zurück
Oben