eXma » Diskutieren » Computer und Technik
Startseite - Veranstaltungen - Mitglieder - Suche
Vollständige Version anzeigen: C pipes
Dr_NickRiviera
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);
}
stth
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