Fork, Unnamed Pipe, kein EOF - warum?!



  • Hallo, ich erkläre mein Problem am besten direkt mit dem Code:

    if(pipe(new_pipe) == -1) {
    	printError("Cannot create unnamed pipe");
    }
    
    while(fgets(input, MAX_LEN_INPUT, stdin) != NULL) {
    		switch(pid_child1 = fork()) {
    			case -1:
    				printError("Error when trying the first fork");
    				break;
    			case 0: /* child 1 */
    				if(close(new_pipe[0]) == -1) {	/* close read-end */
    					printError("Cannot close the Pipe");
    				}
    
    				fdout = fdopen(new_pipe[1], "w");
    				fprintf(fdout, "Test1\n");
    				fclose(fdout);
    				exit(EXIT_SUCCESS);
    
    			default: /* father process */
    	/*
    						if(close(new_pipe[1]) == -1) {
    							printError("Cannot close the Pipe");
    						}
    						fd = fdopen(new_pipe[0], "r");
    						if(fd == NULL) {
    							printError("Cannot open Stream");
    						}
    						printf("Test2\n");
    
    						while(fgets(input, MAX_LEN_INPUT, fd) != NULL) {
    							printf("Test5\n");
    							printf("%s", input);
    							printf("Test4\n");
    						}
    						printf("Test3\n");
    						exit(EXIT_SUCCESS);
    */
    
    				switch(pid_child2 = fork()) {
    					case -1:
    						printError("Error when trying the second fork");
    						break;
    					case 0: /* child 2 */
    						if(close(new_pipe[1]) == -1) {	/* close write-end */
    							printError("Cannot close the Pipe");
    						}
    						fd = fdopen(new_pipe[0], "r");
    						if(fd == NULL) {
    							printError("Cannot open Stream");
    						}
    						printf("Test2\n");
    
    						while(fgets(input, MAX_LEN_INPUT, fd) != NULL) {
    							printf("Test5\n");
    							printf("%s", input);
    							printf("Test4\n");
    						}
    						printf("Test3\n");
    						exit(EXIT_SUCCESS);
    					default: /* father process */
    						break;
    				}
    				break;
    		}
    

    Und zwar:
    Ich schreibe im ersten Kindprozess "Test1" in die Pipe, im zweiten möchte ich es dann auslesen. Da ich aber im ersten Kindprozess die Pipe schließe, sollte doch EOF danach auf der Pipe stehen.....
    Im zweiten Kindprozess bleibe ich aber in der Schleife hängen, da ich kein EOF in der Pipe lese. Sprich, die Ausgabe ist:

    Test2
    Test5
    Test1
    Test4

    Weil ich eben nicht aus der Schleife komme, erhalte ich kein Test3.

    Aber: Wenn ich jetzt kein zweites mal forke, sondern direkt im default Zweig (also der Auskommentierte Code), den gleichen Code stehen habe, so erhalte ich danach noch ein Test3, weil er dort ein EOF einließt. WARUM?!

    Warum lese ich wenn ich kein fork mache EOF ein, aber sobald ich forke, es nichtmehr? Das ergibt irgendwie alles total keinen Sinn für mich und ich sitz da echt schon sehr lange dahinter und es will einfach nicht funktionieren.

    Wäre da wirklich über jede Hilfe äußerst dankbar!

    edit:
    Oh ich hab den Fehler gefunden: Wenn ich im Vaterprozess selbst nur das Write-Ende schließe, dann gehts. Aber: Dann kann ich das nicht in einer Schleife machen, den dann ist auch im Vaterprozess schon das schreib-Ende geschlossen. Das ist doch dämlich, dass ich dann im nächsten Schleifendurchlauf eine neue Pipe aufmacehn muss. Was mache ich den da am besten?



  • man: pipe:

    A pipe that has had an end closed is considered widowed. Writing on such a pipe causes the writing process to receive a SIGPIPE signal. Widowing a pipe is the only way to deliver end-of-file to a reader: after the reader consumes any buffered data, reading a widowed pipe returns a zero count.

    Ich würde mal vermuten, du hast im Hauptprozess noch die Pipe offen, deshalb könntest du von dort aus noch etwas schreiben, wenn du wolltest.



  • Dieser Thread wurde von Moderator/in rüdiger aus dem Forum C (C89 und C99) in das Forum Linux/Unix verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


Anmelden zum Antworten