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