matheraum.de
Raum für Mathematik
Offene Informations- und Nachhilfegemeinschaft

Für Schüler, Studenten, Lehrer, Mathematik-Interessierte.
Hallo Gast!einloggen | registrieren ]
Startseite · Forum · Wissen · Kurse · Mitglieder · Team · Impressum
Forenbaum
^ Forenbaum
Status Mathe
  Status Schulmathe
    Status Primarstufe
    Status Mathe Klassen 5-7
    Status Mathe Klassen 8-10
    Status Oberstufenmathe
    Status Mathe-Wettbewerbe
    Status Sonstiges
  Status Hochschulmathe
    Status Uni-Analysis
    Status Uni-Lin. Algebra
    Status Algebra+Zahlentheo.
    Status Diskrete Mathematik
    Status Fachdidaktik
    Status Finanz+Versicherung
    Status Logik+Mengenlehre
    Status Numerik
    Status Uni-Stochastik
    Status Topologie+Geometrie
    Status Uni-Sonstiges
  Status Mathe-Vorkurse
    Status Organisatorisches
    Status Schule
    Status Universität
  Status Mathe-Software
    Status Derive
    Status DynaGeo
    Status FunkyPlot
    Status GeoGebra
    Status LaTeX
    Status Maple
    Status MathCad
    Status Mathematica
    Status Matlab
    Status Maxima
    Status MuPad
    Status Taschenrechner

Gezeigt werden alle Foren bis zur Tiefe 2

Navigation
 Startseite...
 Neuerdings beta neu
 Forum...
 vorwissen...
 vorkurse...
 Werkzeuge...
 Nachhilfevermittlung beta...
 Online-Spiele beta
 Suchen
 Verein...
 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
Dt. Schulen im Ausland: Mathe-Seiten:Weitere Fächer:

Open Source FunktionenplotterFunkyPlot: Kostenloser und quelloffener Funktionenplotter für Linux und andere Betriebssysteme
StartseiteMatheForenSoftwaretechnik und ProgrammierungC: Pipes: read vs. fread
Foren für weitere Studienfächer findest Du auf www.vorhilfe.de z.B. Astronomie • Medizin • Elektrotechnik • Maschinenbau • Bauingenieurwesen • Jura • Psychologie • Geowissenschaften
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 ^
www.matheraum.de
[ Startseite | Forum | Wissen | Kurse | Mitglieder | Team | Impressum ]