Ich versuche gerade ein kleines Test Programm in C zu schreiben dass mit PIPES arbeitet.
Da fehlen noch einige Fehler-abfang-routinen.
Das Programm liest eine Text Datei ein und gibt diese auf der stdout aus.
Kind1 liest und schriebt in die PIPE
Kind2 liest aus der PIPE und schreibt in die stdout.
soweit die Theorie...
Warum bekomme ich den Fehler "Bad file descriptor".
Sieht irgendwer den Fehler?
Die Ausgabe kommt aber trotzdem irgendwie.
CODE
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int kind1(int fd[],char **argv);
int kind2(int fd[],char **argv);
int main(int argc, char *argv[]){
int fd[2],i,status;
int kid1_erg;
int kid2_erg;
pid_t pid[0],pid_ende[2];
pipe(fd);
pid[0]=fork();
if(pid[0]>0)
if(close(fd[1])==-1)
perror("close(fd[1]) bei Vater");
if(pid[0]==0)
kid1_erg=kind1(fd,argv);
pid[1]=fork();
if(pid[1]>0)
if(close(fd[0])==-1)
perror("close (fd[0]) bei Vater");
if(pid[1]==0)
kid2_erg=kind2(fd,argv);
if(pid[1]>0)
for(i=0;i<2;i++)
{
pid_ende[i]=wait(&status);
printf("\nEnde des Prozesses %d: ",pid_ende[i]);
if (WIFEXITED(status))
{
printf("Der Prozess wurde mit exit(%d) beendet.\n",WEXITSTATUS(status));
}
if (WIFSIGNALED(status))
{
printf("Der Prozess wurde mit kill -%d beendet.\n",WTERMSIG(status));
}
}
exit(0);
}
int kind1(int fd[],char **argv){
FILE *name;
char zeichen;
printf("Kid1 %i Vater=%i\n",getpid(),getppid());
if(close(fd[0])==-1)
perror("close (fd[0]) bei Kind1");
name=fopen(argv[1],"r");
while((zeichen=fgetc(name))!=EOF)
write(fd[1],&zeichen,sizeof(char));
fclose(name);
if(close(fd[1])==-1)
perror("close (fd[1]) bei Kind1");
exit(0);
}
int kind2(int fd[],char **argv){
char zeichen;
printf("Kid2 %i Vater=%i\n",getpid(),getppid());
if(close(fd[1])==-1)
perror("close(fd[1]) bei Kind2");
while((read(fd[0],&zeichen,sizeof(char)))>0)
{
putchar(zeichen);
}
//if(close(0)==-1)
// perror("close 0");
//if(dup(fd[0])==-1)
// perror("DUP");
//execl("./",argv[2],NULL);
if(close(fd[0])==-1)
perror("close (fd[0]) bei Kind2");
exit(0);
}
Dieser Beitrag wurde von Dr_NickRiviera: 20 Oct 2008, 19:38 bearbeitet