QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 2508|回复: 19

新手求Linux下的API说明

[复制链接]
发表于 2004-12-21 14:52:40 | 显示全部楼层 |阅读模式
小弟从来没做过linux编程,但是手头这个项目需要写一个so,供java来调用,需要得到以下信息:
以下信息哪些API能得到:
(1)CPU数量
(2)CPU占用率
(3)内存总容量
(4)内存已使用容量
(5)逻辑硬盘数量
(6)逻辑硬盘容量
(7)逻辑硬盘已使用容量
(8)进程是否在运行,且读出该进程的工作路径

希望各位多多帮忙,能直接给出api和简单的说明也可以,或者给小弟指出哪能找到这些api的说明也行。谢谢各位了!
发表于 2004-12-21 15:15:22 | 显示全部楼层

Re: 新手求Linux下的API说明

[quote:0be1dd8043="wunifeng"]小弟从来没做过linux编程,但是手头这个项目需要写一个so,供java来调用,需要得到以下信息:...[/quote]

linux也有API???
1)读取/proc/stat
2)总利用率:
/proc/stat中的第一行;
每个CPU的例用率
/proc/stat中第二行从cpu0开始,如果只有一个CPU,那就只有cpu0
信息获取方法:
注意cpux:后面有4列数字,依次是user, nice, sys, idle的数值,不用去关心他们是什么意思。
对这个文件需要读取两遍,我们用total表示累计总资源,那么user+sys就是我们想要知道的累计CPU占用的资源。每个变量后面的数字表示它是第几次读文件得到的,用如下方法可算出CPU占用率:
Total_1=user_1+nice_1+sys_1+idle_1
Total_2=user_2+nice_2+sys_2+idle_2
Rate={[(user_2+sys_2)-(user_1+sys_1)]/(total_2-total_1)}*100
由于我们两次读取的时间间隔比较短,我们就近似的认为这就是即时的CPU利用率。
回复

使用道具 举报

发表于 2004-12-21 15:17:00 | 显示全部楼层
3)和4)读取/proc/meminfo
回复

使用道具 举报

发表于 2004-12-21 15:22:56 | 显示全部楼层
问题5)6)7) ,我的解决方法是读/proc/partitons(2.4内核,2.6可以读另外一个,名字我忘了),取name字段,然后读/etc/mtab,j进行匹配,得到挂载点,最后用statfs(mountentry, &fs)得到磁盘信息,容量,剩余量
回复

使用道具 举报

发表于 2004-12-21 15:27:41 | 显示全部楼层
8)遍历/proc所有数字目录,然后挨个进去读,数字是进程id,比如进入1613目录,读取/proc/1613/status ,第一行就是进程名字,全路径在文件/proc/1613/maps里,自己根据进程名字进行匹配可得到,不过有些进程maps是空
回复

使用道具 举报

发表于 2004-12-21 15:32:19 | 显示全部楼层
附上Linux C Function,不过不全

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
回复

使用道具 举报

 楼主| 发表于 2004-12-21 18:49:33 | 显示全部楼层
哇!谢谢 dearbigapple !非常感谢!

小弟从来没做过linux下的开发,还请多多帮助啊!

再次感谢,对我的帮助太大了。
回复

使用道具 举报

 楼主| 发表于 2004-12-22 09:17:49 | 显示全部楼层
dearbigapple 兄上不上CSDN的?
如果上的话,可以去看看
http://community.csdn.net/Expert/topic/3663/3663741.xml?temp=.7289392
这个帖子,小弟把分给你好了。

dearbigapple 兄真是好人,给出这么详细的说明,给小弟帮了很大的忙。如果dearbigapple 兄不嫌弃的话,小弟想跟你联系,在这留下MSN:[email protected]
回复

使用道具 举报

发表于 2004-12-22 09:43:06 | 显示全部楼层
csdn的积分就素那浮云 ,而且我的帐号早就忘了。
其实我也是linux的初学者,而且自觉不算合格的程序员
论坛上有很多高手的
ps 我的msn网页上有,你没注意到而已
[email protected]
回复

使用道具 举报

 楼主| 发表于 2004-12-22 11:23:30 | 显示全部楼层
哈哈,dearbigapple 兄果然很豪爽!
回复

使用道具 举报

发表于 2004-12-24 14:16:17 | 显示全部楼层
那如果我想获取网卡详细的动态信息呢?除了读取/proc下的相应文件外,能不能自己编写一个能适用于不同类型网卡信息的程序呢?如何依此来限制带宽呢?
回复

使用道具 举报

发表于 2004-12-24 17:05:01 | 显示全部楼层
我不是太清楚你指的网卡动态信息是什么?
如果是指端口打开状态可以读文件/proc/net/tcp和/proc/net/udp,端口是在地址后以16进制显示的,netstat命令实际上也是读这两个文件。
如果你想读网卡的具体信息,可以参超下面的程序,是网友gadfly写的:
支持多网卡。很久以前写的,参照几本资料,忘了是哪些。
[code:1]
#include <stdio.h>
#include <sys/types.h>
#include <sys/param.h>

#include <sys/ioctl.h>
#include <sys/socket.h>
#include <net/if.h>
#include <netinet/in.h>
#include <net/if_arp.h>

#define MAXINTERFACES   16

main (argc, argv)
register int argc;
register char *argv[];
{
   register int fd, intrface, retn = 0;
   struct ifreq buf[MAXINTERFACES];
   struct arpreq arp;
   struct ifconf ifc;

   if ((fd = socket (AF_INET, SOCK_DGRAM, 0)) >= 0) {
      ifc.ifc_len = sizeof buf;
      ifc.ifc_buf = (caddr_t) buf;
      if (!ioctl (fd, SIOCGIFCONF, (char *) &ifc)) {
         intrface = ifc.ifc_len / sizeof (struct ifreq);
         printf("interface num is intrface=%d\n\n\n",intrface);
         while (intrface-- > 0)
          {
            printf ("net device %s\n", buf[intrface].ifr_name);

/*Jugde whether the net card status is promisc  */
            if (!(ioctl (fd, SIOCGIFFLAGS, (char *) &buf[intrface]))) {
               if (buf[intrface].ifr_flags & IFF_PROMISC) {
                  puts ("the interface is PROMISC");
                  retn++;
               }
            } else {
               char str[256];

               sprintf (str, "cpm: ioctl device %s", buf[intrface].ifr_name);
               perror (str);
            }

/*Jugde whether the net card status is up       */
            if (buf[intrface].ifr_flags & IFF_UP) {
                puts("the interface status is UP");
               }
            else {
                puts("the interface status is DOWN");
            }

/*Get IP of the net card */
            if (!(ioctl (fd, SIOCGIFADDR, (char *) &buf[intrface])))
                {
                 puts ("IP address is:");
                 puts(inet_ntoa(((struct sockaddr_in*)(&buf[intrface].ifr_addr))->sin_addr));
                 puts("");
                   //puts (buf[intrface].ifr_addr.sa_data);
                }
            else {
               char str[256];

               sprintf (str, "cpm: ioctl device %s", buf[intrface].ifr_name);
               perror (str);
           }
/* this section can't get Hardware Address,I don't know whether the reason is module driver
//          ((struct sockaddr_in*)&arp.arp_pa)->sin_addr=((struct sockaddr_in*)(&buf[intrface].ifr_addr))->sin_addr;
            arp.arp_pa.sa_family = AF_INET;
            arp.arp_ha.sa_family = AF_INET;
            ((struct sockaddr_in*)&arp.arp_pa)->sin_addr.s_addr=((struct sockaddr_in*)(&buf[intrface].ifr_addr))->sin_addr.s_addr;
            if (!(ioctl (fd, SIOCGARP, (char *) &arp)))
                {
                 puts ("HW address is:");

                 printf("%02x:%02x:%02x:%02x:%02x:%02x\n",
                                (unsigned char)arp.arp_ha.sa_data[0],
                                (unsigned char)arp.arp_ha.sa_data[1],
                                (unsigned char)arp.arp_ha.sa_data[2],
                                (unsigned char)arp.arp_ha.sa_data[3],
                                (unsigned char)arp.arp_ha.sa_data[4],
                                (unsigned char)arp.arp_ha.sa_data[5]);

                 puts("");
                 puts("");
                }

*/

/*Get HW ADDRESS of the net card */
            if (!(ioctl (fd, SIOCGIFHWADDR, (char *) &buf[intrface])))
                {
                 puts ("HW address is:");

                 printf("%02x:%02x:%02x:%02x:%02x:%02x\n",
                                (unsigned char)buf[intrface].ifr_hwaddr.sa_data[0],
                                (unsigned char)buf[intrface].ifr_hwaddr.sa_data[1],
                                (unsigned char)buf[intrface].ifr_hwaddr.sa_data[2],
                                (unsigned char)buf[intrface].ifr_hwaddr.sa_data[3],
                                (unsigned char)buf[intrface].ifr_hwaddr.sa_data[4],
                                (unsigned char)buf[intrface].ifr_hwaddr.sa_data[5]);

                 puts("");
                 puts("");
                }

            else {
               char str[256];

               sprintf (str, "cpm: ioctl device %s", buf[intrface].ifr_name);
               perror (str);
           }
        }
      } else
         perror ("cpm: ioctl");

   } else
      perror ("cpm: socket");

    close (fd);
    return retn;
}
回复

使用道具 举报

发表于 2004-12-24 17:08:57 | 显示全部楼层
如果你说的是想截取网络数据包,那就需要libpcap和libnet了,网上有下载
用法也很简单,查查就可以了。

限制网络带宽我不懂
回复

使用道具 举报

发表于 2004-12-24 17:13:35 | 显示全部楼层
如果你是要写网卡驱动,《linux设备驱动程序》对你应该有帮助
如果你是做基于网络的应用,那么ACE(自适应通讯环境)框架可以帮助你
回复

使用道具 举报

发表于 2004-12-26 20:24:54 | 显示全部楼层
呵呵,dearbigapple兄简直就是我的偶像,有机会一定的请你吃饭了,呵呵~如果不介意,在下还有很多问题。dearbigapple兄可否知道在linux中常用的分布对象ipc通信机制有那些?CORBA,EJB还有什么?他们各有什么优缺点?windows 的 COM肯定是没有办法用的。如果我要用c、c++来写一个应用程序,选择那个比较理想呢?
在2.6.X内核中,用户可以通过
/sys/devices/system/cpu/cpu0/cpufreq/scaling_setcpu(好像是这个文件名吧,我现在也记不清了)设置cpu的频率,但是如果要在kernel2.4.x中设置呢?好像没有那个文件。想把cpufreq模块编译挂载到kernel2.4中,能不能只编译模块而不重新编译整个kernel而达到目的呢?thanks..
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-6 16:53 , Processed in 0.067400 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表