Pipe Problem!



  • Hallo an alle,
    ich habe ein Problem mit Pipes und hoffe drauf das ihr mir dabei helfen könnt.
    Das Programm, das ich erstellen soll, soll folgendes machen:
    "Es sollen 2 Kind Prozesse vom Vater erstellt und dann eine Nachricht von Kind Prozess 1 nach Kind Prozess 2 geschickt werden!"
    Nun weiß ich jetzt nicht wie ich die 2 fork()'s aufrufen soll, damit der Kind Prozess nicht noch ein Kind Prozess erstellt? Außerdem weiß ich nicht wie man kontrollieren kann, dass der derzeitige Prozess, der Prozess ist der entweder liesen oder schreiben soll?
    Wäre echt super wenn mir jemand damit weiterhelfen könnte, hier ist noch der Quelltext, den wir modifizieren sollen:

    #include<stdio.h>
    #include<fcntl.h>
    #include<unistd.h>
    #include<sys/types.h>
    #include<sys/stat.h>
    
    #define BUFLEN          80
    #define EXIT_FAILURE    (-1)
    #define EXIT_SUCCESS    (0)
    
    void main        (void);
    void parent      (char *, int);
    void child       (char *, int);
    void fromkeyboard(char *);
    
    int  fildes[2];
    int  pid, status;
    char buffer1[BUFLEN], buffer2[BUFLEN], *s;
    
    void main(void)
    {
            fromkeyboard(buffer1); 
    
            if((pipe(fildes)))
            {
                    printf("Failure 'open pipe'");
                    exit(EXIT_FAILURE);
            }
    
            switch(pid=fork())
            {
                    case    0:
                            child(buffer2, BUFLEN);
                            printf("\nchild read from 'buffer2': %s\n",buffer2);
                            break;
                    case    -1:
                            printf("Failure 'fork-call'");
                            break;
                    default:
    			            printf("parent says: pid child = %d\n",pid);
                            parent(buffer1, BUFLEN);
                            wait(&status);
    			            printf("parent says good by!\n");
                            break;
            }
            exit(EXIT_SUCCESS);
    
    }
    
    void fromkeyboard(char *buffer)
    {
    	printf("Hit some keys please. # Hits < 80: ");
            buffer=gets(buffer);
    
    }
    
    void parent(char *buffer, int  length  )
    {
        write(fildes[1],buffer,length);
    
    }
    
    void child(char *buffer, int  length  )
    {
        sleep(5);
        read(fildes[0],buffer,length);
    
    }
    


  • Dass der Kind-Prozess keinen weiteren Kind-Prozess erzeugt lässt sich dadurch erreichen, dass nur der Prozess, bei dem fork()!=0 ist, einen weiteren Prozess abspaltet.
    Das Ganze müsste etwa so aussehen:

    switch(pid1=fork())
     {
      case -1: perror("Fehler bei fork()");
               exit(1);
      case 0:  write(...) /* Kindprozess 1 */
               return(0); /* ganz wichtig!!! */
      default: switch(pid2=fork())
                {
                 case -1: perror("Fehler bei fork()");
                          exit(1);
                 case 0:  read(...) /* Kindprozess 2 */
                          return(0); /* ganz wichtig!!! */
                 default: ... /* Rest des Vater-Prozesses */
                }
     }
    

    Vergiss nicht, im Vaterprozess mit wait() auf das Ende der Kindprozesse zu warten (oder alternativ einen SIGCHLD-Signalhandler einzurichten), damit keine Zombie-Prozesse entstehen.

    Mehr zu Prozessen, Pipes etc. findest du auch in meinem Buch "C und Linux" 😃


Anmelden zum Antworten