Anzeige:
Ergebnis 1 bis 7 von 7

Thema: [C++]Speicherzugriffsfehler als user

  1. #1
    Registrierter Benutzer
    Registriert seit
    22.12.2003
    Beiträge
    19

    [C++]Speicherzugriffsfehler als user

    ich hab folgendes Programm geschrieben:
    Code:
    #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?

  2. #2
    Registrierter Benutzer
    Registriert seit
    24.06.2003
    Beiträge
    486
    Ü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
    Code:
    #include <iostream>
    #include <cstdlib>
    #include <cstdio> /* Da ist fopen drin */
    using namespace std;

  3. #3
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    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,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  4. #4
    Registrierter Benutzer
    Registriert seit
    22.12.2003
    Beiträge
    19
    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...

  5. #5
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    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,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  6. #6
    Registrierter Benutzer
    Registriert seit
    22.12.2003
    Beiträge
    19
    ahh okay danke!
    gleich morgen mal ausprobieren

  7. #7
    Registrierter Benutzer
    Registriert seit
    22.12.2003
    Beiträge
    19
    okay hab das ganze nun mit stat() gemacht und es scheint zu laufen ... vielen Dank für die Hilfe!

    falls es jemanden vielleicht interessiert:
    Code:
    #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;
    }

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •