Getting the CPU frequency in C

Mel fbsd.questions at rachie.is-a-geek.net
Sun Sep 9 15:18:15 PDT 2007


On Monday 10 September 2007 00:04:45 Martin Tournoij wrote:
> On Sun 09 Sep 2007 22:09, Erik Trulsson wrote:
> > On Sun, Sep 09, 2007 at 10:50:25PM +0200, Martin Tournoij wrote:
> > > I'm trying to get the CPU frequency in C:
> > >
> > > #include <unistd.h>
> > > #include <time.h>
> > > #include <ctype.h>
> > > #include <sys/sysctl.h>
> > > #include <stdio.h>
> > > #include <sys/time.h>
> > >
> > > int main()
> > > {
> > >     int mib[2];
> > >     size_t size;
> > >     struct clockinfo clockrate;
> > >
> > >     mib[0] = CTL_KERN;
> > >     mib[1] = KERN_CLOCKRATE;
> > >     size = sizeof clockrate;
> > >     sysctl(mib, 2, &clockrate, &size, NULL, 0);
> > >
> > >     fprintf(stdout, "hz: %i\n", clockrate.hz);
> > >     fprintf(stdout, "tick: %i\n", clockrate.tick);
> > >     fprintf(stdout, "spare: %i\n", clockrate.spare);
> > >     fprintf(stdout, "stathz: %i\n", clockrate.stathz);
> > >     fprintf(stdout, "profhz: %i\n", clockrate.profhz);
> > >
> > >     return 0;
> > > }
> > >
> > > I tried to run this on two machines (one machine with hw.clockrate:
> > > 1378 and the other 797) and it outputs the same on both:
> > > hz: 1000
> > > tick: 1000
> > > spare: 0
> > > stathz: 133
> > > profhz: 666
> > >
> > > The profhz value suggest the devil is at work :D although it's probably
> > > a some stupid mistake on my part :/ Can anyone help?
> >
> > None of the kern.clockrate entries has any particular relationship with
> > the CPU clock frequency, so it is not unexpected that you would get the
> > same output from both machines.
> >
> > I think looking at hw.clockrate is the most portable you can get.
> > If your CPU is using Cool'n'Quiet or the Intel equivalent you can also
> > look at dev.cpu.N.freq for the current frequency.
>
> I got confused because they both have the same name ... do'h
>
> hw.clockrate doesn't seem to available through C(?), exec-ing sysctl
> hw.clockrate would work, but that's not very elegant...

int main()
{
        const char mib[] = "hw.clockrate";
        size_t size = sizeof(int);
        int clockrate;

        sysctlbyname(mib, (void *)&clockrate, &size, NULL, 0);

        fprintf(stdout, "clockrate: %i\n", clockrate);

        return 0;
}


-- 
Mel


More information about the freebsd-questions mailing list