tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
2
ZUGRIFFE
245
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    bastler bastler ist offline Grünschnabel
    Registriert seit
    Jul 2011
    Beiträge
    2
    Hallo,

    ich programmiere gerede ein etwas größeres C-Programm.
    Nun habe ich den Code für dieses Forum minimiert, um das Problem schnell klar zu machen.
    Ziel ist es, dass ein Kindprozess einem anderen Kindprozess eine einfache Ausgabe seines Standart-Outputs über eine Pipe zum anderen Kindprozess schickt und dieser dann das Geschickte als seinen Standart-Input nimmt.

    Es geht auch fast alles. Nur wartet z.B. der Befehl "sort" scheinbar auf den Stream. Aber der ist dort!
    Zum Beweis, habe ich dann ein kleines Stück des Stream ausgeben lassen (was man unten sieht).

    Mein Programm:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    
    #include <stdio.h>      /* I/O                                   */
    #include <stdlib.h>     /* standard c functions                  */
    #include <string.h>     /* string manipulations                  */
    #include <unistd.h>     /* for the Stream-Management             */
    #include <sys/types.h>
     
    void main(void){
        FILE *umleit;
        int myeins[2];
        char string[256];
        pid_t prozessid=1;
        
        pipe(myeins);
        prozessid=fork();
        if(prozessid==0){
            dup2(myeins[1],STDOUT_FILENO);
            system("ls");
            exit(0);
        }
        prozessid=fork();
        if(prozessid==0){
            dup2(myeins[0],STDIN_FILENO);
            umleit=fdopen(myeins[0],"r");
            printf("\n");
            fscanf(umleit,"%s",&string);
            printf("Empfangen: %s\n",string);
            fscanf(umleit,"%s",&string);
            printf("Empfangen: %s\n",string);
            printf("\n\n");
            system("sort");
            exit(0);
        }
    }

    Die Ausgabe dazu:
    Code :
    1
    2
    
    Empfangen: alt
    Empfangen: datei.txt

    Da auf dem Stream noch mehr liegt, müsste "sort" etwas bekommen, aber der wartet!
    Bitte schaue sich einer mal mein Problem an.
     

  2. #2
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi

    Zuerst einmal muß ich dir sagen: deine Problembeschreibung ist wunderbar! So wünscht man sich das. Danke!

    Das Problem dürfte sein, daß du die Pipe (-Eingabe) nicht schließt. sort kann schließlich erst mit dem Sortieren anfangen wenn die Eingabe vollständig ist.

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  3. #3
    bastler bastler ist offline Grünschnabel
    Registriert seit
    Jul 2011
    Beiträge
    2
    Danke für die Antwort!
    Obwohl mein zuvor beschriebenes Problem beseitigt ist, tritt nun leider ein weiteres auf:
    Der erzeugende Prozess (Elternprozess) soll immer auf seine Kindprozesse warten.

    Eigendlich kein Problem, aber hier schon. Das selbe Programm wie oben habe ich nun auf das Problem angepasst.
    Das Problem erkläre ich unter dem Code:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    
    #include <stdio.h>      /* I/O                                   */
    #include <stdlib.h>     /* standard c functions                  */
    #include <string.h>     /* string manipulations                  */
    #include <unistd.h>     /* for the Stream-Management             */
    #include <sys/types.h>
    #include <sys/wait.h>
     
    void main(void){
        FILE *umleit;
        int myeins[2];
        int status;
        char string[256];
        pid_t prozessid=1;
        
        pipe(myeins);
        prozessid=fork();
        if(prozessid==0){
            close(myeins[0]);
            dup2(myeins[1],STDOUT_FILENO);
            system("ls");
            close(myeins[1]);
            
            exit(0);
        }
        if (prozessid!=0) {
            printf("Nach erstem Prozess\n");
            while(waitpid(prozessid,&status,WNOHANG)==0){};
        }
        prozessid=fork();
        if(prozessid==0){
            close(myeins[1]);
            dup2(myeins[0],STDIN_FILENO);
            system("sort");
            close(myeins[0]);
            exit(0);
        }
        if (prozessid!=0) {
            printf("Nach zweitem Prozess\n");
            while(waitpid(prozessid,&status,WNOHANG)==0){}; // um diese Zeile geht es
        }
    }

    Wenn ich nun die makierte Zeile (die mit dem Kommentar) komplett auskommentiere, dann kommt folgende Ausgabe:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    benutzer@linux-2mj4:~/prog/proj2> ./test2
    Nach erstem Prozess
    Nach zweitem Prozess
    benutzer@linux-2mj4:~/prog/proj2> alt
    Fehlercode.txt
    inputfile
    output
    shell
    shell.c
    shell.c~
    sicherung
    temp
    test
    ^C

    Wie man sieht, hat sich der Elternprozess schon beendet, als der Kindprozess "sort" ausführt. Nach dem ausführen bleibt der Prozess stehen und man muss ihn abbrechen.
    Wenn ich die makierte Zeile mit kompiliere gibt er folgendes aus (was man auch irgendwann abbrechen muss):

    Code :
    1
    2
    3
    4
    
    benutzer@linux-2mj4:~/prog/proj2> ./test2
    Nach erstem Prozess
    Nach zweitem Prozess
    ^C

    Ich möchte aber, dass der Elternprozess solange wartet, bis sich der gegenwärtige Kindprozess beendet hat.
     

Ähnliche Themen

  1. Antworten: 6
    Letzter Beitrag: 02.11.11, 16:03
  2. Unzip über stdin
    Von DasArne im Forum Linux & Unix
    Antworten: 5
    Letzter Beitrag: 09.02.10, 01:07
  3. Einlesen über stdin (argv)
    Von Blondie05 im Forum C/C++
    Antworten: 1
    Letzter Beitrag: 27.01.05, 11:58
  4. [C] Linux: stdout in pipe umleiten
    Von plonk im Forum C/C++
    Antworten: 3
    Letzter Beitrag: 25.04.04, 16:06
  5. Antworten: 1
    Letzter Beitrag: 16.06.03, 16:31