PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C++]Speicherzugriffsfehler als user



McRip
08-02-2004, 15:42
ich hab folgendes Programm geschrieben:


#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include <iostream.h>
#include <stdlib.h>
unsigned long Dateigroesse;
unsigned long Dateigroessealt;
float speed;

unsigned long GetFileSize(char *Name)
{
FILE *f = fopen (Name, "r+b");
fseek (f, 0, SEEK_END);
long filesize = ftell (f);
fseek (f, 0, SEEK_SET);
return filesize;
}
int main(int argc, char *argv[])
{
char *Name=argv[1];
int i=0;
cout <<"Dateigroesse momentan: " << GetFileSize(Name) << endl;
while(i==0)
{
sleep(1);
Dateigroesse=GetFileSize(Name);
cout <<"Dateigroesse momentan: " << Dateigroesse << endl;
speed=(Dateigroesse-Dateigroessealt)/1024;
Dateigroessealt=Dateigroesse;
if (speed>1000)
{
speed=speed/1024;
cout << speed << "mb/s" << endl;
}
else
{
cout << speed << "kb/s" << endl;
}

}
return EXIT_SUCCESS;
}


Das Programm soll jede Sekunde die Größe einer Datei mit der Größe der Datei vor einer Sekunde vergleichen und dadruch die Geschwindigkeit mit der sie geschrieben wird ermitteln.
es funktioniert auch, nur wenn ich es als User statt als root starten möchte bekomme ich einen Speicherzugriffsfehler ... genauso wenn ich es mit einer Datei starte, welche nicht vorhanden ist.

Hat da jmd. vielleicht eine Idee?

wraith
08-02-2004, 16:09
Überprüfe den Rückgabewert von fopen,wenn 0,dann gab es einen Fehler.
Klar,wenn Datei nicht vorhanden,oder die nötigen Rechte fehlen.
Du willst nur lesen,also lasse das + weg.

Zum bestimmen der Dateilänge würde ich auch eher auf BS spezifische Funktionen oder POSIX Funktionen zurückgreifen.

Und natürlich der Klassiker


#include <iostream>
#include <cstdlib>
#include <cstdio> /* Da ist fopen drin */
using namespace std;

anda_skoa
08-02-2004, 20:11
Original geschrieben von wraith
Zum bestimmen der Dateilänge würde ich auch eher auf BS spezifische Funktionen oder POSIX Funktionen zurückgreifen.


stat zum Beispiel
man 2 stat

Ciao,
_

McRip
18-02-2004, 13:32
und wie bringe ich stat nun in meinem Programm unter?
habs nämlich nun mit den Tips von euch hinbekommen mit fopen doch das Proggy schmiert dann nach einiger Zeit ab ... wie machen das Proggys wie z.B. ls? Werde aus der Source von ls irgendwie nicht so recht schlau...

anda_skoa
18-02-2004, 20:42
Aus man 2 stat


#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

int stat(const char *file_name, struct stat *buf);


Also eine Instanz der Struktur stat anlegen und deren Adresse und den Filenamen an stat übergeben.
Wenn Rückgabewert == 0, Werte aus der Strukturinstanz auslesen.

Ciao,
_

McRip
18-02-2004, 22:15
ahh okay danke! :)
gleich morgen mal ausprobieren

McRip
19-02-2004, 21:59
okay hab das ganze nun mit stat() gemacht und es scheint zu laufen ... vielen Dank für die Hilfe!

falls es jemanden vielleicht interessiert:

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include <iostream>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

using namespace std;

unsigned long Dateigroesse;
unsigned long Dateigroessealt;
float speed;

unsigned long GetFileSize(char *Name)
{
struct stat buf;
stat( Name, &buf );
return buf.st_size;
}

int main(int argc, char *argv[])
{
char *Name=argv[1];
int i=0;
cout <<"Dateigroesse momentan: " << GetFileSize(Name) << endl;
while(i==0)
{
sleep(1);
Dateigroesse=GetFileSize(Name);
if(Dateigroesse>1000)
{
if(Dateigroesse/1024>1000)
{
if((Dateigroesse/1024)/1024>1000)
{
cout<<"Dateigroesse momentan: " << ((Dateigroesse/1024)/1024)/1024
<< " gb" << endl;
}
cout <<"Dateigroesse momentan: " <<(Dateigroesse/1024)/1024 << "mb"
<< endl;
}
else
{
cout <<"Dateigroesse momentan: " << Dateigroesse/1024 << " kb" << endl;
}
}
else
{
cout <<"Dateigroesse momentan: " << Dateigroesse << " kb" << endl;
}
speed=(Dateigroesse-Dateigroessealt)/1024;
Dateigroessealt=Dateigroesse;
if (speed>1000)
{
speed=speed/1024;
cout << speed << "mb/s" << endl;
}
else
{
cout << speed << "kb/s" << endl;
}

}
return EXIT_SUCCESS;
}