Anzeige:
Ergebnis 1 bis 7 von 7

Thema: [C] I/O-Puffer abschalten

  1. #1
    Registrierter Benutzer Avatar von roadracer
    Registriert seit
    16.02.2010
    Ort
    Wolfenbüttel
    Beiträge
    48

    Question [C] I/O-Puffer abschalten

    Hallo,
    schon wieder ein Thread von mir hier.

    Also, zum Thema:
    Ich habe ein Programm in Arbeit. Dieses soll die Anzahl der gesendeten Bytes in /sys/class/net/eth0/statistics/rx_bytes (oder so) lesen und auswerten. Später soll die ganze Geschichte (auch) auf meinem Homeserver (TrekStor/Linux/ARM) laufen. Programmieren tue ich aber an meinem normalen PC (OpenSUSE/x86).

    Zum Problem:
    Da /sys/class/net/eth0/statistics/rx_bytes alle paar Sekunden ausgelesen werden soll, muss ich die Pufferung dieser Datei unterbinden, da sonst immer der selbe Wert eingelesen wird. Eigentlich mit einer FILE-Struktur und setbuf()/setvbuf() kein Problem. Nachdem das aber auf meinem Server nicht ging, habe ich noch einen Filedescriptor und 0_SYNC/O_DIRECT probiert. Bringt aber auch nix.
    PC(x86):

    • file = fopen("/sys/class/net/eth0/statistics/rx_bytes", "r");
      geht nicht!
    • file = fopen("/sys/class/net/eth0/statistics/rx_bytes", "r");
      setbuf(file, NULL);

      -oder-
      setvbuf(file, NULL, _IONBF, 0);
      geht!
    • fd = open("/sys/class/net/eth0/statistics/rx_bytes", O_RDONLY);
      geht!
    • fd = open("/sys/class/net/eth0/statistics/rx_bytes", O_RDONLY | O_SYNC);
      geht!
    • fd = open("/sys/class/net/eth0/statistics/rx_bytes", O_RDONLY | O_DIRECT);
      geht!
    • fd = open("/sys/class/net/eth0/statistics/rx_bytes", O_RDONLY | O_SYNC | O_DIRECT);
      geht!

    Server(ARM):

    • file = fopen("/sys/class/net/eth0/statistics/rx_bytes", "r");
      geht nicht!
    • file = fopen("/sys/class/net/eth0/statistics/rx_bytes", "r");
      setbuf(file, NULL);

      -oder-
      setvbuf(file, NULL, _IONBF, 0);
      geht nicht!
    • fd = open("/sys/class/net/eth0/statistics/rx_bytes", O_RDONLY);
      geht nicht!
    • fd = open("/sys/class/net/eth0/statistics/rx_bytes", O_RDONLY | O_SYNC);
      geht nicht!
    • fd = open("/sys/class/net/eth0/statistics/rx_bytes", O_RDONLY | O_DIRECT);
      geht nicht!
    • fd = open("/sys/class/net/eth0/statistics/rx_bytes", O_RDONLY | O_SYNC | O_DIRECT);
      geht nicht!

    Das einzige was hilft, ist die Datei vor jedem Auslesen zu schließen und neu zu öffnen. Das ist aber ziemliche Pfuscherei.

    Für mich sieht es so aus, als habe Trekstor in seiner Firmware den Linux-Kernel gepached, dass er die Unterbindung der Pufferung nicht mehr zulässt.
    Kennt jemand eine Lösung?

    VG
    OpenSUSE 12.1 x86 KDE 4.7

    Alle Rechtschreibfehler unterliegen der GFDL und dürfen so oder in veränderter Form genutzt und weiter gegeben werden.

  2. #2
    Registrierter Benutzer Avatar von sommerfee
    Registriert seit
    02.07.2006
    Beiträge
    1.603
    Zitat Zitat von roadracer Beitrag anzeigen
    Dieses soll die Anzahl der gesendeten Bytes in /sys/class/net/eth0/statistics/rx_bytes (oder so) lesen und auswerten.
    Habe ich das richtig verstanden? Es geht nur darum, wie groß diese Datei ist? Dann würde ich stat() nehmen.

  3. #3
    Registrierter Benutzer Avatar von roadracer
    Registriert seit
    16.02.2010
    Ort
    Wolfenbüttel
    Beiträge
    48
    Was, Größe der Datei? Die kann ich dir jetzt schon sagen: In jedem Fall 4096 Byte egal was drinsteht.
    Ich möchte im Sekundentakt diese Datei immer wieder auslesen und auswerten. Nur muss ich dafür die Pufferung abstellen und das will mir auf meinem Homeserver nicht gelingen.
    OpenSUSE 12.1 x86 KDE 4.7

    Alle Rechtschreibfehler unterliegen der GFDL und dürfen so oder in veränderter Form genutzt und weiter gegeben werden.

  4. #4
    Registrierter Benutzer
    Registriert seit
    14.01.2002
    Beiträge
    657
    ein paar ideen:

    - datei immer neu auf/zumachen
    - mmap verwenden?

  5. #5
    Registrierter Benutzer Avatar von roadracer
    Registriert seit
    16.02.2010
    Ort
    Wolfenbüttel
    Beiträge
    48
    mmap hört sich recht interessant an, mir ist nur noch nicht ganz klar wie ich es bei meinem Problem einsetzten soll.
    Ich würde es einfach so versuchen:
    Code:
    file = open(...);
    mapped_m = mmap(..., file, ...);
    while(...) {
    read(mapped_m, ...); msync(file, ...);
    } munmap(file, ...);
    Kommt das hin?
    OpenSUSE 12.1 x86 KDE 4.7

    Alle Rechtschreibfehler unterliegen der GFDL und dürfen so oder in veränderter Form genutzt und weiter gegeben werden.

  6. #6
    Registrierter Benutzer Avatar von undefined
    Registriert seit
    01.03.2004
    Beiträge
    1.255
    In anbetracht dessen das ohnehin immer nur eine Zeile drinne steht
    PHP-Code:
    /**
    * gcc -W -Wextra -pedantic -o example open.c
    */

    #include <stdio.h>
    #include <stdlib.h>
    #include <errno.h>
    #include <fcntl.h>
    #include <unistd.h>

    int main(void)
    {
      
    int c;
      
    size_t *malloc(0);
      
    char **gptr = (char **)malloc(sizeof(char *));

      
    FILE *fp fopen("/sys/class/net/eth0/statistics/rx_bytes","r");
      if(
    NULL == fp)
      {
        
    fprintf(stderr"Öffnen von %s fehlgeschlagen!\n""rx_bytes");
        return 
    EXIT_FAILURE;
      }

      while((
    getline(gptrtfp)) > 0)
      {
        
    fputs(*gptrstdout);
      }
      
    fclose(fp);

      return 
    EXIT_SUCCESS;

    mfg undefined
    --
    Undefined Behavior (undefiniertes Verhalten) bedeutet meistens etwas ungültiges.
    xhtml Debugger

  7. #7
    Registrierter Benutzer Avatar von roadracer
    Registriert seit
    16.02.2010
    Ort
    Wolfenbüttel
    Beiträge
    48
    @undefined:
    Das geht zwar auf meinem x86 PC, jedoch nicht auf meinem ARM Homeserver, wo ich die Datei im Sekundentakt immer wieder auslesen muss.
    OpenSUSE 12.1 x86 KDE 4.7

    Alle Rechtschreibfehler unterliegen der GFDL und dürfen so oder in veränderter Form genutzt und weiter gegeben werden.

Lesezeichen

Berechtigungen

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