execcp("sh", NULL) und eine broken pipe



  • hallo.

    ich habe folgenden code

    dup2(inpe[1], STDIN_FILENO) ;
    	dup2(outpe[0], STDOUT_FILENO) ;
    
    	fcntl(STDIN_FILENO, F_SETFD, !FD_CLOEXEC);
    	fcntl(STDOUT_FILENO, F_SETFD, !FD_CLOEXEC);
    
    	execvp("sh", NULL);
    

    zwei pipes, ueber eine schreibe ich, ueber die andere lese ich. diese beiden pipes setze ich dann entprechend auf die standardeingabe und standardausgabe. nun exece ich eine shell - die muesste die ein- und ausgabedeskriptoren ja uebernehmen, da !FD_CLOEXEC gestellt ist.
    prozess wird prima kreiert, sogar die shell entsteht, aber sobald ich den ersten befehl an die shell sende (ueber die stdin-pipe), bricht das programm mit einem "Broken Pipe" ab. Liegt der Fehler in dieser codesequenz? in welchem format muss der string, der den shellbefehl enthaelt (also ueber STDIN_FILENO eingelesen wird) in die pipe geschrieben werden? mit einem abschliessendem '\n' oder '\0'? wuerde mich sehr freuen, wenn jemand rat wuesste... ich bin ueber jede hilfe dankbar

    Gruss caspar



  • U. a. ist dein execvp()-Aufruf falsch (argv[0] muss es geben und muss = Programmname sein). Wie das mit der Pipe als Standard-Ein/Ausgabe richtig funktioniert zeigt dieses Beispielprogramm aus meinem Buch "C und Linux" 😉

    C und Linux | ISBN: 3446224270

    /*
        pipe2.c - Pipes als Standardein- und -ausgabe
    */
    
    # include <stdio.h>
    # include <unistd.h>
    # include <sys/wait.h>
    
    int main()
     {
      int fd1[2], fd2[2], l;
      char buffer[80];
    
      if ((pipe(fd1) != 0) || (pipe(fd2) != 0))
       {
        perror("pipe2: pipe() failed");
        return(1);
       }
    
      if (fork() == 0)
       {
        close(fd1[1]);		    /* Kind-Prozess */
        close(fd2[0]);
        if ((dup2(fd1[0], STDIN_FILENO) == -1)
            || (dup2(fd2[1], STDOUT_FILENO) == -1))
         {
          perror("pipe2: dup2() failed");
          return(1);
         }
        close(fd1[0]);
        close(fd2[1]);
        execlp("sort", "sort", NULL);
        perror("pipe2: execlp() failed");
        return(1);
       }
    
      close(fd1[0]);		  /* Eltern-Prozess */
      close(fd2[1]);
    
      write(fd1[1], "These\nlines\nshall\nbe\nsorted\n",
            28);
      close(fd1[1]);
      wait(NULL);
    
      if ((l = read(fd2[0], buffer, 79)) == -1)
        perror("pipe2: read() failed");
      else
        write(STDOUT_FILENO, buffer, l);
    
      close(fd2[0]);
      return(0);
     }
    

    Martin


Anmelden zum Antworten