www.vorhilfe.de
Vorhilfe

Kostenlose Kommunikationsplattform für gegenseitige Hilfestellungen.
Hallo Gast!einloggen | registrieren ]
Startseite · Forum · Wissen · Kurse · Mitglieder · Team · Impressum
Forenbaum
^ Forenbaum
Status Vorhilfe
  Status Geisteswiss.
    Status Erdkunde
    Status Geschichte
    Status Jura
    Status Musik/Kunst
    Status Pädagogik
    Status Philosophie
    Status Politik/Wirtschaft
    Status Psychologie
    Status Religion
    Status Sozialwissenschaften
  Status Informatik
    Status Schule
    Status Hochschule
    Status Info-Training
    Status Wettbewerbe
    Status Praxis
    Status Internes IR
  Status Ingenieurwiss.
    Status Bauingenieurwesen
    Status Elektrotechnik
    Status Maschinenbau
    Status Materialwissenschaft
    Status Regelungstechnik
    Status Signaltheorie
    Status Sonstiges
    Status Technik
  Status Mathe
    Status Schulmathe
    Status Hochschulmathe
    Status Mathe-Vorkurse
    Status Mathe-Software
  Status Naturwiss.
    Status Astronomie
    Status Biologie
    Status Chemie
    Status Geowissenschaften
    Status Medizin
    Status Physik
    Status Sport
  Status Sonstiges / Diverses
  Status Sprachen
    Status Deutsch
    Status Englisch
    Status Französisch
    Status Griechisch
    Status Latein
    Status Russisch
    Status Spanisch
    Status Vorkurse
    Status Sonstiges (Sprachen)
  Status Neuerdings
  Status Internes VH
    Status Café VH
    Status Verbesserungen
    Status Benutzerbetreuung
    Status Plenum
    Status Datenbank-Forum
    Status Test-Forum
    Status Fragwürdige Inhalte
    Status VH e.V.

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:

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 ^
www.vorhilfe.de