www.vorhilfe.de
- Förderverein -
Der Förderverein.

Gemeinnütziger Verein zur Finanzierung des Projekts Vorhilfe.de.
Hallo Gast!einloggen | registrieren ]
Startseite · Mitglieder · Impressum
Forenbaum
^ Forenbaum
Status VH e.V.
  Status Vereinsforum

Gezeigt werden alle Foren bis zur Tiefe 2

Navigation
 Startseite...
 Suchen
 Impressum
Das Projekt
Server und Internetanbindung werden durch Spenden finanziert.
Organisiert wird das Projekt von unserem Koordinatorenteam.
Hunderte Mitglieder helfen ehrenamtlich in unseren moderierten Foren.
Anbieter der Seite ist der gemeinnützige Verein "Vorhilfe.de e.V.".
Partnerseiten
Weitere Fächer:

Open Source FunktionenplotterFunkyPlot: Kostenloser und quelloffener Funktionenplotter für Linux und andere Betriebssysteme
Forum "Softwaretechnik und Programmierung" - C: Pipes: read vs. fread
C: Pipes: read vs. fread < Softwaretechnik+Pro < Praktische Inform. < Hochschule < Informatik < Vorhilfe
Ansicht: [ geschachtelt ] | ^ Forum "Softwaretechnik und Programmierung"  | ^^ Alle Foren  | ^ Forenbaum  | Materialien

C: Pipes: read vs. fread: Frage (beantwortet)
Status: (Frage) beantwortet Status 
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


        
Bezug
C: Pipes: read vs. fread: Antwort
Status: (Antwort) fertig Status 
Datum: 10:35 So 15.05.2011
Autor: Event_Horizon

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.


Bezug
                
Bezug
C: Pipes: read vs. fread: Frage (beantwortet)
Status: (Frage) beantwortet Status 
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

Bezug
                        
Bezug
C: Pipes: read vs. fread: Antwort
Status: (Antwort) fertig Status 
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


Bezug
                                
Bezug
C: Pipes: read vs. fread: Mitteilung
Status: (Mitteilung) Reaktion unnötig Status 
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


Bezug
                                        
Bezug
C: Pipes: read vs. fread: Mitteilung
Status: (Mitteilung) Reaktion unnötig Status 
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


Bezug
                                                
Bezug
C: Pipes: read vs. fread: Frage (beantwortet)
Status: (Frage) beantwortet Status 
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




Bezug
                                                        
Bezug
C: Pipes: read vs. fread: Antwort
Status: (Antwort) fertig Status 
Datum: 16:33 Do 19.05.2011
Autor: MathePower

Hallo paulN,


[willkommenmr]


> > 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

Bezug
Ansicht: [ geschachtelt ] | ^ Forum "Softwaretechnik und Programmierung"  | ^^ Alle Foren  | ^ Forenbaum  | Materialien


^ Seitenanfang ^
ev.vorhilfe.de
[ Startseite | Mitglieder | Impressum ]