Hallo!
Ich soll ein "verteilten Taschenrechner" erstellen welcher so funktionieren sollte:
- pipes aufbauen und prozess forken
- einlesen der zahlen und der rechenoperation im Partenprozess
- übergabe der eingelesenen werte an den Childprozess
- Child berechnet das ergebnis und gibt es an den Parentprozess zurück
- Paren gibt das Ergebnis aus.
mein problem ist, dass ich im Parent das ergebnis nicht ausgeben kann (im Child funktioniert die ausgabe ...).
was mich wundert: n (anzahl der Buchstaben die übergeben werden) im Child prozess hat den wert z.b.: 11 und im Parent beträgt n dann nur noch 1.
leider bin ich noch nicht auf den fehler draufgekommen...
Quellcode:
C
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
int main (void)
{
int fd1[2] ; // Pipe1 fd[0] = read, fd[1]=write
int fd2[2] ; // Pipe2 fd[0] = read, fd[1]=write
char buf[100], buf_zahl1[50], buf_zahl2[50], rz[2];
int n=0;
int ergebnis=0, zahl1=0, zahl2=0; // Variable
pid_t ForkPID ;
if (pipe(fd1) < 0)
{
printf("Pipe1 creation failed ...\n") ;
exit(1) ;
}
if (pipe(fd2) < 0)
{
printf("Pipe1 creation failed ...\n") ;
exit(1) ;
}
if ((ForkPID=fork()) < 0)
{
printf("Fork failed ...\n") ;
exit(1) ;
}
if (ForkPID == 0) // THE CHILD
{
close(fd1[1]) ; // close write port --> read
close(fd2[0]) ; // close read port --> write
n = read(fd1[0],buf_zahl1,sizeof(buf_zahl1)); // einlesen des gesendeten vom Parent
buf_zahl1[n]=(char)NULL; // Nullterminierung
n = read(fd1[0],rz,sizeof(rz));
rz[n]=(char)NULL;
n = read(fd1[0],buf_zahl2,sizeof(buf_zahl2));
buf_zahl2[n]=(char)NULL;
zahl1= atoi(buf_zahl1);
zahl2= atoi(buf_zahl2);
if (rz[0] == '+')
{
ergebnis= zahl1 + zahl2;
}
if (rz[0]== '-')
{
ergebnis= zahl1 - zahl2;
}
if (rz[0]== '*')
{
ergebnis= zahl1 * zahl2;
}
if (rz[0]== '/')
{
ergebnis= zahl1 / zahl2;
}
sprintf (buf, "Ergebnis= %d\n",ergebnis);
// write (STDOUT_FILENO, buf , strlen(buf));
n = write (fd2[1],buf,strlen(buf));
printf ("n= %d\n",n);
}
else // THE PARENT
{
close(fd1[0]) ; // close read port --> write
close(fd2[1]) ; // close write port --> read
char *Buffer= "Zahl 1 = ";
char *Buffer1= "Rechenzeichen= ";
char *Buffer2= "Zahl 2 = ";
write (STDOUT_FILENO, Buffer, strlen(Buffer));
n = read (STDIN_FILENO,buf_zahl1,sizeof(buf_zahl1));
buf_zahl1[n]=(char)NULL;
write (fd1[1],buf_zahl1,strlen(buf_zahl1));
write (STDOUT_FILENO, Buffer1, strlen(Buffer1));
n = read (STDIN_FILENO,rz,sizeof(rz));
rz[n]=(char)NULL;
write (fd1[1],rz,strlen(rz));
write (STDOUT_FILENO, Buffer2, strlen(Buffer2));
n = read (STDIN_FILENO,buf_zahl2,sizeof(buf_zahl2));
buf_zahl2[n]=(char)NULL;
write (fd1[1],buf_zahl2,strlen(buf_zahl2));
n = read(fd2[0],buf,sizeof(buf));
printf ("n1= %d\n",n);
buf[n]='\0';
write(STDOUT_FILENO,buf,strlen(buf));
}
return(0);
}
Alles anzeigen
vielleicht findet ja wer den fehler ...
danke schon mal im vorraus. lg Bambi