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 dankbarGruss 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