AIX高手进!如何取到当前CPU的使用率????????????????

小兽 2006-08-25 02:42:21
注意:
是“当前”的;如果使用iostat或者vmstat,第一行显示的是统计信息。
如果使用iostat -t 1的话,会有一个1秒的延迟——也就是说,要等待1秒才能得到CPU使用情况。
我现在程序里面需要的是立即就能得到当前CPU的使用情况,哪位高手知道该怎么做???
...全文
596 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
小兽 2006-08-25
  • 打赏
  • 举报
回复
是啊,所以很麻烦····
现在正想办法处理一下iostat,看看能不能解决···
fytzzh 2006-08-25
  • 打赏
  • 举报
回复
那就不好办了。读/dev/kmem是很好的办法了。
你想想为什么sar等命令也要root权限?
小兽 2006-08-25
  • 打赏
  • 举报
回复
但是只有root才能设置文件所有者啊··
我这边很bt的,根本不给root权限···
fytzzh 2006-08-25
  • 打赏
  • 举报
回复
可以设置SUID啊。
程序的所有者是root,设置SUID可以以普通用户身份运行。
小兽 2006-08-25
  • 打赏
  • 举报
回复
楼上的程序读/dev/kmem需要root权限吧?
可我的程序不能取root权限。
如果有权限的话,也可以用sar了···
楼上的高手还有没有其他办法啊?
fytzzh 2006-08-25
  • 打赏
  • 举报
回复
读/dev/kmem文件,下面是一些片段

#ifdef _AIX


/* -- AIX/6000 System monitor
**
** getkmemdata.c
**
*/

#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#include "getkmemdata.h"

int kmemfd = -1;

/*********************************************************************/

int getkmemdata(void *buf, int bufsize, caddr_t address)
{
int n;

/*
* Do stuff we only need to do once per invocation, like opening
* the kmem file and fetching the parts of the symbol table.
*/
if (kmemfd < 0)
{
if ((kmemfd = open("/dev/kmem", O_RDONLY)) < 0)
{
//perror("kmem");
return -3;
}
/*
* We only need to be root for getting access to kmem, so give up
* root permissions now!
*/
setuid(getuid());
setgid(getgid());

/*
* Set the close on exec bit for the kmem file descriptor.
*/
if (fcntl(kmemfd, F_SETFD, FD_CLOEXEC) == -1)
{
//perror("fcntl kmem");
close(kmemfd);
return -1;
}
}
/*
* Get the structure from the running kernel.
*/
lseek(kmemfd, (off_t) address, SEEK_SET);
n = read(kmemfd, buf, bufsize);

return(n);

} /* getkmemdata */


#endif/*#ifdef _AIX*/


int get_cpuinfo(struct cpuinfo **cpu)
{
/*
* -2申请内存失败
* -1系统函数调用失败
* >0成功返回
*/

int rtn = 0;
n_cpus = _system_configuration.ncpus;

if (!kernelnames[0].n_value)
{
if (knlist(kernelnames, 1, sizeof(struct nlist)) == -1)
{
return -1;
}
}

if (!*cpu)
{
*cpu = (struct cpuinfo *)calloc(n_cpus, sizeof(struct cpuinfo));
if (*cpu == NULL)
{
return -2;
}
}


rtn = getkmemdata((char *) *cpu, sizeof(struct cpuinfo) * n_cpus,
(caddr_t) kernelnames[0].n_value);
if (rtn < 0)
{
return rtn;
}

return n_cpus;

} /* get_cpuinfo */
小兽 2006-08-25
  • 打赏
  • 举报
回复
晕~是不是周五下午都不务正业呢··

23,121

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧