Buchempfehlung
Windows-Programmierung. Das Entwicklerhandbuch zur WIN32-API
Windows-Programmierung. Das Entwicklerhandbuch zur WIN32-API
"Der" Petzold, das über 1000 Seiten starke Standardwerk zum Win32-API - besonders nützlich u. a. bei der GUI-Programmierung in FreeBASIC! [Mehr Infos...]
FreeBASIC-Chat
Es sind Benutzer im FreeBASIC-Chat online.
(Stand:  )
FreeBASIC bei Twitter
Twitter FreeBASIC-Nachrichten jetzt auch über Twitter erhalten. Follow us!

Code-Beispiel

Code-Beispiele » System

[LINUX] Laufwerks-Statisktik ermitteln

Lizenz:Erster Autor:Letzte Bearbeitung:
k. A.MitgliedThePuppetMaster 01.02.2008

Um die Laufwerks-Statistiken zu ermitteln nutzen wir die Datei /proc/diskstas. Sie enthält alle Laufwerke (auch wirtuelle) und deren Zugriffe.

Im Sniplet wurde die RAM udn LOOP Devices auskommentiert, da sie selten genutzt werden, udn so gut wie nie in funktion sind. Wer dennoch Statistiken darüber möchte, kann sie einfach aus dem Select Case raus nehmen.

Genau Dokumentationen zu der Datei diskstats existieren nicht. jedoch kann man einen vergleich mit dem programm vmstat ziehen, der seine Informationen zum teil aus diskstats bezieht.

Type driveinfo
    Device          as String
    Major           as UByte
    Minor           as UByte
    ReadTotal       as ULongInt
    ReadMerged      as ULongInt
    ReadSectors     as ULongInt
    ReadToNextMS    as ULongInt
    WriteTotal      as ULongInt
    WriteMerged     as ULongInt
    WriteSectors    as ULongInt
    WriteToNextMS   as ULongInt
end type

Declare Function F_Usage_Drives(B_DD() as driveinfo, ByRef B_DC as UShort) as UByte

Function F_Usage_Drives(B_DD() as driveinfo, ByRef B_DC as UShort) as UByte
B_DC = 0
Dim XFID as Integer
Dim D as String
Dim DD() as String
Dim DC as Long
Dim X as Long
XFID = FreeFile
Open "/proc/diskstats" for input as #XFID
Do
    Input #XFID, D
    DC += 1: Redim Preserve DD(DC) as String: DD(DC) = D
    If D = "" Then Exit do
Loop
Close #XFID
Dim T as String
Dim XPos as UShort
Dim TD() as String
Dim TC as Long
For X = 1 to DC
    D = DD(X)
    TC = 0
    Do
        XPos = InStr(1, D, " ")
        If XPos > 0 Then
            T = Trim(Mid(D, 1, XPos - 1)): D = Trim(Mid(D, XPos + 1))
        Else: T = D: D = ""
        End If
        If T <> "" Then TC += 1: Redim Preserve TD(TC) as String: TD(TC) = T
        If D = "" Then Exit Do
    Loop
    If TC >= 7 Then
        Select case lcase(left(TD(3), 2))
            case "", "ra", "lo"
            case else
                B_DC += 1
                Redim Preserve B_DD(B_DC) as driveinfo
                With B_DD(B_DC)
                    .Device = TD(3)
                    .Major = Val(TD(1))
                    .Minor = Val(TD(2))
                    .ReadTotal = ValLng(TD(4))
                    .ReadMerged = ValLng(TD(5))
                    .ReadSectors = ValLng(TD(6))
                    .ReadToNextMS = ValLng(TD(7))
                    If TC >= 11 Then
                        .WriteTotal = ValLng(TD(8))
                        .WriteMerged = ValLng(TD(9))
                        .WriteSectors = ValLng(TD(10))
                        .WriteToNextMS = ValLng(TD(11))
                    End If
                End With
                If B_DC = 255 Then Exit For
        End select
    End If
Next
Return 0
End Function

Wir das ganze dann aussieht, udn wie man es abfragt, kann man diesem Beispiel-Aufruf entnehmen.
Hierbei ist zu beachten, das die Totalen Werte ermittelt werden! Wer Zeitlich bedingte (Zugriff/sek.) haben möchte, muss mindestens 2 Aufrufe hintereinander durchführen, mit z.B. bei /sek. 1sek. abstand. Anschliessend subtrahiert man den ersten Wert vom zweiten, udn erhält so die aktuelle Zugriffslast.

Dim DD() as driveinfo
Dim DC as UShort
Dim X as UInteger
F_Usage_Drives(DD(), DC)
For X = 1 to DC
    With DD(X)
        Print "== " & .Device & " =="
        Print "Major: " & .Major
        Print "Minor: " & .Minor
        Print "Read-Total:     " & .ReadTotal
        Print "Read-Merged:    " & .ReadMerged
        Print "Read-Sectors:   " & .ReadSectors
        Print "Read-ToNextMS:  " & .ReadToNextMS
        Print "Write-Total:    " & .WriteTotal
        Print "Write-Merged:   " & .WriteMerged
        Print "Write-Sectors:  " & .WriteSectors
        Print "Write-ToNextMS: " & .WriteToNextMS
        Print ""
    End With
Next

Zusätzliche Informationen und Funktionen
  Bearbeiten Bearbeiten  

  Versionen Versionen