使用C的系统调用,如何获得CPU的利用率?

前端之家收集整理的这篇文章主要介绍了使用C的系统调用,如何获得CPU的利用率?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在FreeBSD上的C中,如何访问cpu利用率?

我正在编写一些代码来处理HTTP重定向.如果cpu负载超过FReeBSD系统的阈值,我想重定向客户端请求.查看手册页,kvm_getpcpu()似乎是正确的答案,但手册页(我读过)没有记录用法.

任何提示或指示都会受到欢迎 – 谢谢!

在这里阅读答案后,我能够提出以下内容.由于文档很差,我不是100%肯定它是正确的,但顶部似乎同意.感谢所有回答的人.

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/sysctl.h>
#include <unistd.h>

#define CP_USER   0
#define CP_NICE   1
#define CP_SYS    2
#define CP_INTR   3
#define CP_IDLE   4
#define cpuSTATES 5

int main()
{
        long cur[cpuSTATES],last[cpuSTATES];
        size_t cur_sz = sizeof cur;
        int state,i;
        long sum;
        double util;

        memset(last,sizeof last);

        for (i=0; i<6; i++)
        {
                if (sysctlbyname("kern.cp_time",&cur,&cur_sz,NULL,0) < 0)
                {
                        printf ("Error reading kern.cp_times sysctl\n");
                        return -1;
                }

                sum = 0;
                for (state = 0; state<cpuSTATES; state++)
                {
                        long tmp = cur[state];
                        cur[state] -= last[state];
                        last[state] = tmp;
                        sum += cur[state];
                }

                util = 100.0L - (100.0L * cur[CP_IDLE] / (sum ? (double) sum : 1.0L));
                printf("cpu utilization: %7.3f\n",util);
                sleep(1);
        }

        return 0;
}

解决方法

从MAN页面

名称

kvm_getmaxcpu,kvm_getpcpu – 访问每cpu数据

图书馆

内核数据访问库(libkvm,-lkvm)

概要

#include <sys/param.h>
 #include <sys/pcpu.h>
 #include <sys/sysctl.h>
 #include <kvm.h>

 int
 kvm_getmaxcpu(kvm_t *kd);

 void *
 kvm_getpcpu(kvm_t *kd,int cpu);

描述

kvm_getmaxcpu()和kvm_getpcpu()函数用于访问
由kd指示的内核中活动处理器的每cpu数据.该
kvm_getmaxcpu()函数返回支持的最大cpu
内核. kvm_getpcpu()函数返回一个缓冲区,其中包含
单个cpucpu数据.这个缓冲区由struct pcpu描述
类型.调用者负责通过调用释放缓冲区
免费(3)不再需要时.如果cpu不活动,则为NULL
而是返回.

CACHING

这些函数缓存各种内核变量的nlist值
在连续的调用中重复使用.您可以使用kd set调用任一函数
为NULL以清除此缓存.

返回值

成功时,kvm_getmaxcpu()函数返回最大数量
内核支持cpu.如果发生错误,则返回-1.

成功时,kvm_getpcpu()函数返回指向已分配的指针
缓冲区或NULL.如果发生错误,则返回-1.

如果任一函数遇到错误,则可能出现错误消息
通过kvm_geterr检索(3.)

编辑

这是kvm_t结构:

struct __kvm {
    /*
     * a string to be prepended to error messages
     * provided for compatibility with sun's interface
     * if this value is null,errors are saved in errbuf[]
     */
    const char *program;
    char   *errp;           /* XXX this can probably go away */
    char    errbuf[_POSIX2_LINE_MAX];
    #define ISALIVE(kd) ((kd)->vmfd >= 0)
    int     pmfd;           /* physical memory file (or crashdump) */
    int     vmfd;           /* virtual memory file (-1 if crashdump) */
    int     unused;         /* was: swap file (e.g.,/dev/drum) */
    int     nlfd;           /* namelist file (e.g.,/kernel) */
    struct kinfo_proc *procbase;
    char   *argspc;         /* (dynamic) storage for argv strings */
    int     arglen;         /* length of the above */
    char    **argv;         /* (dynamic) storage for argv pointers */
    int     argc;           /* length of above (not actual # present) */
    char    *argbuf;        /* (dynamic) temporary storage */
    /*
     * Kernel virtual address translation state.  This only gets filled
     * in for dead kernels; otherwise,the running kernel (i.e. kmem)
     * will do the translations for us.  It could be big,so we
     * only allocate it if necessary.
     */
    struct vmstate *vmst;
};

猜你在找的C&C++相关文章