_
toggle menu eXmatrikulationsamt.de
online: 372 gäste

>C pipes Bad file descriptor..

Themen Layout: Standard · Linear · [Outline] Thema abonnieren | Thema versenden | Thema drucken
post 20 Oct 2008, 19:34
avatar
Vordiplom
*****

Punkte: 739
seit: 22.06.2005

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
ProfilPM
AntwortenZitierenTOP
Beiträge
Dr_NickRiviera   C pipes   20 Oct 2008, 19:34
1 Nutzer liest/lesen dieses Thema (1 Gäste)
0 Mitglieder: