C: Pipes: read vs. fread < Softwaretechnik+Pro < Praktische Inform. < Hochschule < Informatik < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 05:33 So 15.05.2011 | Autor: | Imbecile |
Aufgabe | Erklären Sie anhand von Ü 2.8 den Unterschied zwischen den /O-Funktionen, die auf Filedeskriptoren (open, read, write, …) bzw. auf binären I/O-Datenströmen (fopen, fread, fwrite, …) arbeiten. Implementieren Sie dafür zwei Versionen von Ü 2.8 (einmal mit read/etc. und einmal mit fread/etc.) und erklären Sie die Unterschiede ausführlich. |
Hallo!
Also in Beispiel 2.8 war ein Programm zu schreiben in dem ein Elternprozess Zahlen eines Arrays über eine Pipe an einen Kindprozess übergibt.
Der Kindprozess soll summe durchschnitt minimum und maximum der Werte berechnen.
Dieses Beispiel habe ich auch mit write und read über die Pipe zusammen gebracht.
Mein Problem liegt nun an den Befehlen fwrite und fread.
Welche Parameter übergebe ich denn wenn ich mit pipes arbeite?
mein fwrite schaut so aus:
int array[]={19,9,17,15,4,12,6,3,4,136}, length;
length = sizeof(array)/sizeof(array[0]);
fwrite(array,sizeof(int),length,thePipe[WRITE]);
Wobei thePipe[WRITE] die Pipe mit dem Schreibzugriff ist.
Ich bekomme folgenden Fehler beim compilieren mit gcc:
UE3-1b.c:108: warning: passing argument 4 of ‘fwrite’ makes pointer from integer without a cast
/usr/include/stdio.h:708: note: expected ‘struct FILE * __restrict__’ but argument is of type ‘int’
Kann mir jemand zeigen wie man fwrite und fread mit pipes richtig anwendet?
Vielen Dank vorerst mal!
lg,
Imbecile
|
|
|
|
Hallo!
Offensichtlich verschluckt er sich an dem file-handler, denn er erwartet ja ein FILE*, du gibts ihm aber ein INT.
Da du aber nicht zeigst, wie dein thePipe[WRITE] zustande kommt, können wir dir nicht sagen, was da genau nicht stimmt.
In der c++-Referenz gibts übrigens ein Minimalbeispiel.
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 10:31 Mo 16.05.2011 | Autor: | Imbecile |
Eingabefehler: "{" und "}" müssen immer paarweise auftreten, es wurde aber ein Teil ohne Entsprechung gefunden (siehe rote Markierung)
Hallo!
Also hier mal die wichtigen ausschnitte meines Programms:
int thePipe[2];
pid_t pid;
pid = fork();
if (pid < (pid_t)0) {
fprintf(stderr, "Fork failed.\n");
return EXIT_FAILURE;
}
if (pid == (pid_t)0) {
close(thePipe[WRITE]);
fread(); /*hier sollte aus der Pipe gelesen werden*/
/*hier folgen dann die Berechnungen*/
close(thePipe[READ]);
return EXIT_SUCCESS;
}
if (pid > (pid_t)0) {
int array[]={19,9,17,15,4,12,6,3,4,136}, length;
length = sizeof(array)/sizeof(array[0]);
close(thePipe[READ]);
fwrite(array,sizeof(int),length,thePipe[WRITE]);
close(thePipe[WRITE]);
waitpid(-1, NULL, 0);
return EXIT_SUCCESS;
}
}
Im Kind-Prozess hab ich noch nichts programmiert, da beim Elternprozess schon der fehler mit fwrite ist...
Ich weiß leider nicht wie ich es anders machen sollt, leider hab ich auch kein Beispiel im Internet gefunden...
Auf jeden Fall mal Danke für die Antwort!
lg,
Imbecile
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 11:40 Mo 16.05.2011 | Autor: | felixf |
Eingabefehler: "{" und "}" müssen immer paarweise auftreten, es wurde aber ein Teil ohne Entsprechung gefunden (siehe rote Markierung)
Moin!
> Hallo!
> Also hier mal die wichtigen ausschnitte meines Programms:
>
> int thePipe[2];
> pid_t pid;
>
> pid = fork();
> if (pid < (pid_t)0) {
> fprintf(stderr, "Fork failed.\n");
> return EXIT_FAILURE;
> }
>
> if (pid == (pid_t)0) {
> close(thePipe[WRITE]);
>
> fread(); /*hier sollte aus der Pipe gelesen
> werden*/
> /*hier folgen dann die Berechnungen*/
> close(thePipe[READ]);
> return EXIT_SUCCESS;
> }
> if (pid > (pid_t)0) {
> int array[]={19,9,17,15,4,12,6,3,4,136}, length;
> length = sizeof(array)/sizeof(array[0]);
>
> close(thePipe[READ]);
> fwrite(array,sizeof(int),length,thePipe[WRITE]);
Du versuchst hier, mit fread auf einem File-Deskriptor (int) zuzugreifen. Das geht allerdings nicht: fread liest nur aus Streams (FILE*). Du musst schon read() bzw. write() benutzen und nicht fread() bzw. fwrite()!
LG Felix
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 01:50 Do 19.05.2011 | Autor: | paulN |
Eingabefehler: "{" und "}" müssen immer paarweise auftreten, es wurde aber ein Teil ohne Entsprechung gefunden (siehe rote Markierung)
> Eingabefehler: "{" und "}" müssen immer paarweise
> auftreten, es wurde aber ein Teil ohne Entsprechung
> gefunden (siehe rote Markierung)
>
> Moin!
>
> > Hallo!
> > Also hier mal die wichtigen ausschnitte meines
> Programms:
> >
> > int thePipe[2];
> > pid_t pid;
> >
> > pid = fork();
> > if (pid < (pid_t)0) {
> > fprintf(stderr, "Fork failed.\n");
> > return EXIT_FAILURE;
> > }
> >
> > if (pid == (pid_t)0) {
> > close(thePipe[WRITE]);
> >
> > fread(); /*hier sollte aus der Pipe gelesen
> > werden*/
> > /*hier folgen dann die Berechnungen*/
> > close(thePipe[READ]);
> > return EXIT_SUCCESS;
> > }
> > if (pid > (pid_t)0) {
> > int array[]={19,9,17,15,4,12,6,3,4,136}, length;
> > length = sizeof(array)/sizeof(array[0]);
> >
> > close(thePipe[READ]);
> > fwrite(array,sizeof(int),length,thePipe[WRITE]);
>
> Du versuchst hier, mit fread auf einem File-Deskriptor
> (int) zuzugreifen. Das geht allerdings nicht: fread liest
> nur aus Streams (FILE*). Du musst schon read() bzw. write()
> benutzen und nicht fread() bzw. fwrite()!
>
> LG Felix
>
Hallo,
Die Sache ist die, ich muss das selbe Beispiel auch machen. Nur ist es in der Aufgabenstellung explizit gefordert, dass wir zwischen Parent und Child Prozess via unnamed Pipe kommunizieren und die Funktionen fread und fwrite verwenden MÜSSEN.
Wie ich mit unnamed pipes via open close write read arbeite ist mir klar. Das musste wir ja schon machen. Meine Frage ist jetzt wie kann ich die Befehle fread fwrite im zusammenhang mit unnamed pipes verwenden.
Vielleicht kann mir da wer helfen wie ich die richtig aufrufe bzw richtig damit umgehe.
Lg, Paul
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 09:14 Do 19.05.2011 | Autor: | felixf |
Moin
> Die Sache ist die, ich muss das selbe Beispiel auch machen.
> Nur ist es in der Aufgabenstellung explizit gefordert, dass
> wir zwischen Parent und Child Prozess via unnamed Pipe
> kommunizieren und die Funktionen fread und fwrite verwenden
> MÜSSEN.
>
> Wie ich mit unnamed pipes via open close write read arbeite
> ist mir klar. Das musste wir ja schon machen. Meine Frage
> ist jetzt wie kann ich die Befehle fread fwrite im
> zusammenhang mit unnamed pipes verwenden.
>
> Vielleicht kann mir da wer helfen wie ich die richtig
> aufrufe bzw richtig damit umgehe.
Nun, es gibt die Befehle popen und pclose zum Oeffnen/Schliessen von Pipes, die mit FILE* arbeiten. Dann kannst du auch fread/fwrite benutzen.
LG Felix
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 12:21 Do 19.05.2011 | Autor: | paulN |
> Nun, es gibt die Befehle popen und pclose zum
> Oeffnen/Schliessen von Pipes, die mit FILE* arbeiten. Dann
> kannst du auch fread/fwrite benutzen.
>
> LG Felix
>
Bin mit popen und pclose irgendwie nicht weiter gekommen. Drum hab ich mal mit fdopen gespielt. Jetzt funktionierts bei mir soweit, dass mein parent mit fwrite was los screibt, mein child mit fread liest. Das ganze lauft in 2 for schleifen, eine im parent eine im child, ab. Nur hab ich das Problem das meine for schleife im child nur 1 mal ausgeführt wird. Lässt mein fread die irgendwie abbrechen. Leider komme ich gerade nicht weiter, vl kann mir wer weiter helfen :) ?
Anbei noch mein aktueller Code.
#define READ 0
#define WRITE 1
int main(int argc, char **argv) {
if (argc >= 2) {
if ((argc > 2) || ((strcmp(argv[1], "-help") != 0) && (strcmp(argv[1],
"--help") != 0))) {
printf("Wrong usage. Type -help or --help for [mm] information\n");
[/mm]
return EXIT_FAILURE;
} else if ((argc == 2) && (((strcmp(argv[1], "-help") == 0) || (strcmp(
argv[1], "--help") == 0)))) {
printf("Start the Programm without any argument [mm] \n");
[/mm]
return EXIT_FAILURE;
} else {
}
};
FILE *write;
FILE *read;
int thePipe[2];
pid _t pid;
if (pipe(thePipe) == -1) {
perror("pipe");
exit(EXIT_FAILURE);
}
pid = fork();
if (pid < (pid _t) 0) {
fprintf(stderr, "Fork failed. [mm] \n");
[/mm]
return EXIT_FAILURE;
}
read = fdopen(thePipe[READ],"r");
write = fdopen(thePipe[WRITE],"w");
if (pid == 0) {
close(thePipe[WRITE]);
int num = 0;
int a;
int sum, min, max;
float average = 0;
sum = 0;
int tempArr[10];
for (a = 0; a < 10; a++) {
fread(&num,sizeof(int)*100,400,read);
//read(thePipe[READ], &num, 1);
printf("[C] number is: [mm] %d\n", [/mm] num);
//tempArr[a] = num;
}
min = tempArr[0];
max = tempArr[0];
for (a = 0; a < 10; a++) {
sum = sum + tempArr[a];
if( tempArr[a]< min)
{
min = tempArr[a];
} else{}
if (tempArr[a] > max)
{
max = tempArr[a];
}
}
average =(float)sum/(sizeof(tempArr)/sizeof(int));
printf("[C] sum %d \ n", sum);
printf("[C] min: %d \ n",min);
printf("[C] max: %d \ n",max);
printf("[C] Average: %f \ n",average);
close(thePipe[READ]);
exit(EXIT_SUCCESS);
}
else if(pid > 0){
int array[] = { 19, 9, 17, 15, 4, 12, 6, 3, 4, 136 };
close(thePipe[READ]);
int i;
for (i = 0; i < 10; i++) {
int number = array[i];
fwrite(&number, sizeof(int)*100,400,write);
//write(thePipe[WRITE],&number,1);
}
close(thePipe[WRITE]);
}
//sleep(5);
//wait(&status);
return EXIT_SUCCESS;
}
ps.: an manchen stellen sind zuviele whitespaces hatte da ein paar formatierungs probleme.
LG, Paul
|
|
|
|
|
Hallo paulN,
> > Nun, es gibt die Befehle popen und pclose zum
> > Oeffnen/Schliessen von Pipes, die mit FILE* arbeiten. Dann
> > kannst du auch fread/fwrite benutzen.
> >
> > LG Felix
> >
>
> Bin mit popen und pclose irgendwie nicht weiter gekommen.
> Drum hab ich mal mit fdopen gespielt. Jetzt funktionierts
> bei mir soweit, dass mein parent mit fwrite was los
> screibt, mein child mit fread liest. Das ganze lauft in 2
> for schleifen, eine im parent eine im child, ab. Nur hab
> ich das Problem das meine for schleife im child nur 1 mal
> ausgeführt wird. Lässt mein fread die irgendwie
> abbrechen. Leider komme ich gerade nicht weiter, vl kann
> mir wer weiter helfen :) ?
Entscheidend, weshalb fread nur einmal ausgeführt wird, ist der Rückgabewert.
Siehe dazu: fread - C++ Reference
Gruss
MathePower
|
|
|
|