_
toggle menu eXmatrikulationsamt.de
online: 330 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
 
Antworten
post 20 Oct 2008, 19:45
avatar
der vierkonsonantige
*********

Punkte: 3812
seit: 12.12.2003

da ist zu wenig struktur drine um das freiwillig zu lesen...

klingt nach wir arbeiten auf einem nicht definierten filedescriptor... versuch mal fehler- und kontrollausgaben auf stderr mit den werten von getpid() anzufüttern, um den prozess und den fehler herauszufinden...

fprintf(stderr, "%d jetzt mach ich das", getpid());

und hau dir vorher raus, wer was is
fprintf(stderr, "kind 1 = %d, kind 2 = %d", pid[0], pid[1]);

€: ich meinte natürlich fprintf nicht sprintf, sry

Dieser Beitrag wurde von stth: 21 Oct 2008, 10:26 bearbeitet


--------------------
jeden tag einen dummen kommentar!
hab ich bei den fadfindern gelernt.
bild kann nicht angezeigt werden

bild kann nicht angezeigt werden bild kann nicht angezeigt werden bild kann nicht angezeigt werden bild kann nicht angezeigt werden
"if you have a hammer, every problem looks like a nail"
ProfilPM
AntwortenZitierenTOP
Beiträge
Dr_NickRiviera   C pipes   20 Oct 2008, 19:34
1 Nutzer liest/lesen dieses Thema (1 Gäste)
0 Mitglieder: