sysctlnametomib() Parameter sizep

JochenF

Well-Known Member
Hallo,

irgendwie benimmt sich mein sysctlnametomib() nicht so wie in der man page sysctl(3) beschrieben.

The number of
elements in the mib array is given by the location specified by sizep
before the call, and that location gives the number of entries copied
after a successful call.

Bei mir liefert das folgende Testprogramm immer 1 zurück, egal was ich als Namen übergebe.

Code:
int main(int argc, char **argv) {
    size_t len;
    char *p;
    int mib[100];
   
    len = 100;
    sysctlnametomib(argv[1], mib, &len);
    printf("nametomib: len=%zu\n",len);

Damit kann natürlich auch das Beispiel aus der manpage nicht funktionieren.

Code:
           /* Fill out the first three components of the mib */
           len = 4;
           sysctlnametomib("kern.proc.pid", mib, &len);

           /* Fetch and print entries for pid's < 100 */
           for (i = 0; i < 100; i++) {
                   mib[3] = i;
                   len = sizeof(kp);
                   if (sysctl(mib, 4, &kp, &len, NULL, 0) == -1)
                           perror("sysctl");
                   else if (len > 0)
                           printkproc(&kp);
           }
Ist das normal?
 
Manche MIBs sind arrays. Das ist der Grund, warum's sizep gibt: damit du weißt, wieviele Elemente du zurückbekommen hast. Du wirst einen Wert größer 1 angezeigt bekommen, wenn du z.B. "kern.vnode" abfragst.

Am Rande: du möchtest prüfen, ob sysctlnametomib auch brav eine 0 zurückgibt. ;)
 
Manche MIBs sind arrays. Das ist der Grund, warum's sizep gibt: damit du weißt, wieviele Elemente du zurückbekommen hast.

Du meinst jetzt wohl den sysctl(), ich rede vom sysctlnametomib(), der liefert ja nicht die Daten, sondern den Vektor zur Abfrage der Daten. Das ist ein Unterschied.

Am Rande: du möchtest prüfen, ob sysctlnametomib auch brav eine 0 zurückgibt. ;)
Wieso 0? Ich möchte wissen ob ich mit meiner Vermutung richtig liege. Was ich der manpage entnehme, liefert der zurück wieviele "Komponenten" der Name hatte. Für "dev.acpi_ibm.0.fan" würde ich 4 erwarten, für "dev.acpi_ibm.0" würde ich 3 erwarten. Dem ist aber offensichtlich nicht so.
 
Hmm, ich hab groben Unsinn erzählt: sysctlnametomib funktioniert nicht so, wie ich dachte. Ich kann dein Problem trotzdem nicht nachvollziehen. Was für "Namen" übergibst du denn?


Na wegen Fehlerbehandlung...
Code:
if (sysctlnametomib(...) != 0) {
  /* oops, something's wrong... */
}
 
The number of elements in the mib array is given by the location specified by sizep before the call, and that location gives the number of entries copied after a successful call.

sysctl kern.smp.cpus gibt nur einen Eintrag zurück, daher ist len nach dem Aufruf 1.

Rob
 
Wenn ich dein Programm baue und ausführe, bekomme ich folgende Ausgabe:

./test kern.smp
nametomib: len=2

./test kern.smp.cpus
nametomib: len=3

Ich meinte auch nicht sysctl(3), sondern sysctl(8). Dennoch lag ich falsch.

Rob
 
Interressant. Genau so hätte ich das auch erwartet. Dann ist das bei meinem FreeBSD 11 anders, ich bekomme immer nur len=1 zurück.
 
Das ist ja witzig: nachdem ich vorhin neu gebooted habe, macht er es jetzt richtig. Da muss sich irgendwas im laufenden Betrieb zerlegt haben.
 
Zurück
Oben