C Fork, Pipe, Binary Tree, Shared Memory

Julexander

Lieutenant
Registriert
Juli 2004
Beiträge
568
[FONT=verdana,sans-serif]Die Prozesse sind in ein Binarytree organisiert (main/root -> 2x children -> 4x children -> 8x ....)
Leafs produzieren Daten die ueber die eigenen Parents zum Main/Root weitergegeben werden.
Transport mit Hilfe von Pipes.
Das Senden eines Signals ein irgendeinen Prozess verursacht, dass dieser seine Daten direkt an den Root mit Hilfe von Shared Memory, welche dann in die Konsole ausgegeben werden.

Bisher hab ich so viel:
Ich wollte erst ueberhaupt main und den letzten child schreiben, damit ich sehe wie das weitergeben der Pipes funktio0niert, aber beim Printen kommen komische Zeichen heraus :/

[/FONT]
Code:
[FONT=verdana,sans-serif]
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdarg.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <errno.h>

void child_3(int* parent_pipe){
  sleep(2);
  char string[] = "Yo mAN";
  close(*parent_pipe);
  write(*parent_pipe, string, (strlen(string)+1));
}

//fork 0 = child
//else parent
int main(int argc, char**argv){
    int mainpipe1[2], mainpipe2[2];
    int childpipe1[2], childpipe2[2];
    
    int nbytes;
    char readbuffer[80], readbuffer2[80];
    //char string[] = "Yo\n";;
    pipe(mainpipe1);
    //pipe(mainpipe2);
    pipe(childpipe1);
    //pipe(childpipe2);
    
  int f;
  f = fork();
  if(f == 0){ //CHILD
    
    close(childpipe1[1]); //pipe from child - read from
    child_3(childpipe1);
    
    int nbytes2 = read(mainpipe1[childpipe1[0]], readbuffer2, sizeof(readbuffer2));
    close(mainpipe1[0]); // pipe to parent - write
      write(mainpipe1[1], readbuffer2, (strlen(readbuffer2)+1));
    
    
  } else { // PARENT
  
      close(mainpipe1[1]);
      nbytes = read(mainpipe1[0], readbuffer, sizeof(readbuffer));
    printf("Received string1: %s \n", readbuffer);
    
  }

  wait(0);
  return 0;
 
}[/FONT]
 
Du gibst deinem Kind einen Zeiger auf die Pipe und führst das close() dann darauf aus. Ohnehin brauchst du die Pipe gar nicht an deinen Kindprozess weiterzugeben, denn das Kind erbt die Pipe ohnehin. Du musst also nur eine einzige Pipe im Parent vor dem fork() erstellen, dann forken, dann im Kind die Leseseite mit close(pipename[0]) schließen und dann kannst du mit write auf den Filedescriptor pipename[1] schreiben. Im Parent musst du dann mit close(pipename[1]) die Schreibseite der Pipe schließen und dann kannst du mit read() auf den Filedescriptor pipename[0] lesen.
 
Zurück
Oben