Anzeige:
Ergebnis 1 bis 8 von 8

Thema: Pipe funktionirt nicht

  1. #1
    Registrierter Benutzer
    Registriert seit
    08.05.2004
    Beiträge
    49

    Pipe funktionirt nicht

    Hi,

    in dem unten angegbenen code soll einfach nur eine pipe erzeugt werden und ein zeichen in diese pipe geschrieben werden. nur leider bekomme ich bei dem aufruf:
    vater 1 T
    bekomme ich leider immer:
    Send schlug fehl: : Socket operation on non-socket

    Wer kann mir helfen?

    Code:
    #include <unistd.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    
    #define PIPE_BUF2 1
    
    int main(int argc, char **argv) {
      int fd[2];
      int result=0;
      int ressend=0;
      int resrecv=0;
      int anzahl=0;
      pid_t soehne[atoi(argv[1])];
      pid_t pidVater=getpid();
      int i=0;
      char puffer[PIPE_BUF2];
    
      if (2 < argc) {
        anzahl = atoi(argv[1]);
        if ((argc-2) == anzahl) {
    
          /**
           * Pipe anlegen
           */
          result = pipe(fd);
          if ((-1) == result) {
           perror("Bei erzeugen der Pipe ist ein Fehler aufgetretten: ");
           exit(-1);
          }
    
          /**
           * Soehne anlegen
           */
          for (i=0; i<anzahl; i++) {
            if (getpid() == pidVater) {
              soehne[i] = fork();
              if ((-1) == soehne[i]) {
                perror("Fehler bei fork(): ");
                exit(-1);
              }
            }
          }
          
          /**
           * Wenn ich der Vater bin Lese- /Schreibseite der Pipe schliessen
           */
          if (getpid() == pidVater) {
            /* Lese Seite der Pipe schliessen */
            close(fd[1]);
    
            /* 1 Zeichen in die PIPE schreiben */
            i=2; /*nur fuer die test phase. programm funktionirt dann nur mit "<programmaufruf> 1 T" */
            ressend = send(fd[0], argv[i], 1, 0);
            if ((-1) == ressend) {
              perror("Send schlug fehl: ");
              exit(-1);
            }
          }
        }
        else {
          printf ("Die Anzahl der Zeichen ist Falsch!\n");
        }
      }
      else {
        printf ("Falsche Komandozeilenparameter!\nRichtig: Anzahl der Soehne angeben und dann folgend die auszugebenden Zeichen!\n");
      }
      return 0;
    danke pfefferkeks

  2. #2
    Registrierter Benutzer Avatar von klewan
    Registriert seit
    06.05.2005
    Ort
    Wien
    Beiträge
    99
    is ne pipe nich einfach nur ne pipe und kein socket? :-)

    probiers mal mit write(2)

  3. #3
    Registrierter Benutzer
    Registriert seit
    08.05.2004
    Beiträge
    49
    ok es ist eine PIPE

    aber leider soll ich send und receive benutzen. Steht leider so in der Aufgabenstellung.
    ;(

    gruesse pfefferkeks

  4. #4
    Registrierter Benutzer Avatar von klewan
    Registriert seit
    06.05.2005
    Ort
    Wien
    Beiträge
    99
    welche aufgabenstellung ? :-D

    machen wir hier jetzt schon hausaufgaben ?! *fG*


    lol na dann musste auch glaub ich nen SOCKET aufmachen
    hmmm


    lg

  5. #5
    Registrierter Benutzer
    Registriert seit
    08.05.2004
    Beiträge
    49
    die die mein professor uns gestellt hat.

    da ich die aufgabe ja selbst loessen moechte habe ich euch nur den code gegeben wo der fehler drin auftritt

    naja dann werde ich mich mal wider ans testen machen. das muss doch gehen da ich mit write die fehlermeldung eines falschen filedescriptors bekomme .

    gruesse und danke

  6. #6
    Registrierter Benutzer Avatar von klewan
    Registriert seit
    06.05.2005
    Ort
    Wien
    Beiträge
    99
    Code:
    #include <stdio.h>
    #include <sys/types.h>
    #include <unistd.h>
    #include <errno.h>
    
    int ChildCode(int writeable_fd) {
    
    
    }
    
    int main(int argc, char ** argv) {
    	int fd[2];
    	int pid;
    	FILE * fp;
    	char b,c;
    	int d;
    	
    	//printf("Father's Pid: %d", getpid());
    	
    	if(pipe(fd) < 0) {
    		perror("pipe");
    		exit(1);
    	}	
    	pid=fork();
    	if(pid <0) {
    		perror("Fork");
    		exit(1);
    	}
    	if(pid) {
    		close(fd[1]); //No writing to it
    		printf("Parent Code\n");
    		while((d=read(fd[0], &c, 1)) >= 0) {
    			if(d > 0) {
    				printf("GOT: %c\n", c);
    			}
    			
    		}
    		
    		
    	} else {
    		close(fd[0]); //No Reading
    		printf("Child Code\n");
    		write(fd[1], "a", 1);
    		sleep(3);
    		write(fd[1], "b", 1);
    		sleep(3);
    		write(fd[1], "c", 1);
    	}
    		
    	
    
    }


    send/recv is nur für sockets

    meinte euer prof vielleicht ihr sollt unix_sockets als ipc verwenden ?

  7. #7
    Registrierter Benutzer
    Registriert seit
    08.05.2004
    Beiträge
    49
    Hi,

    danke dir.

    Dann werde ich wohl noch mal genau nachfragen muessen da in der Aufgabenstellung von einer PIPE und send sowie receive die rede ist.

    danke dir gruesse pfefferkeks

  8. #8
    Registrierter Benutzer Avatar von klewan
    Registriert seit
    06.05.2005
    Ort
    Wien
    Beiträge
    99
    naja du kannst ja auch nen socket als pipe missbrauchen *fG* :-)


    edit:
    und wenn euer prof pipe(2) verlangt dann muss auch ein beispiel mit write(2) zählen *fg*


    am ende is doch nur das ziel das ziel *fG* :-D

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •