Chinaunix首页 | 论坛 | 博客
  • 博客访问: 403172
  • 博文数量: 95
  • 博客积分: 5001
  • 博客等级: 大校
  • 技术积分: 1030
  • 用 户 组: 普通用户
  • 注册时间: 2007-05-13 11:43
文章分类

全部博文(95)

文章存档

2007年(95)

我的朋友

分类: LINUX

2007-05-13 12:47:07

练习一:观察Linux行为

1./proc文件系统

/proc 文件系统是一种内核和内核模块用来向进程 (process) 发送信息的机制 (所以叫做 /proc)。这个伪文件系统让你可以和内核内部数据结构进行交互,获取 有关进程的有用信息,在运行中 (on the fly) 改变设置 (通过改变内核参数) 与其他文件系统不同,/proc 存在于内存之中而不是硬盘上。如果你察看文件 /proc/mounts ( mount 命令一样列出所有已经加载的文件系统),你会看到其中 一行是这样的:

grep proc /proc/mounts
/proc /proc proc rw 0 0

/proc 由内核控制,没有承载 /proc 的设备。因为 /proc 主要存放由内核控制的状态信息,所以大部分这些信息的逻辑位置位于内核控制的内存。对 /proc 进行一次 'ls -l' 可以看到大部分文件都是 0 字节大的;不过察看这些文件的时候,确实可以看到一些信息。这怎么可能?这是因为 /proc 文件系统和其他常规的文件系统一样把自己注册到虚拟文件系统层 (VFS) 了。然而,直到当 VFS 调用它,请求文件、目录的 i-node 的时候,/proc 文件系统才根据内核中的信息建立相应的文件和目录。

1)加载 proc 文件系统

如果系统中还没有加载 proc 文件系统,可以通过如下命令加载 proc 文件系统:

mount -t proc proc /proc
上述命令将成功加载你的 proc 文件系统。更多细节请阅读 mount 命令的 man page

/proc 的文件可以用于访问有关内核的状态、计算机的属性、正在运行的进程的状态等信息。大部分 /proc 中的文件和目录提供系统物理环境最新的信息。尽管 /proc 中的文件是虚拟的,但它们仍可以使用任何文件编辑器或像'more', 'less' 'cat'这样的程序来查看。当编辑程序试图打开一个虚拟文件时,这个文件就通过内核中的信息被凭空地 (on the fly) 创建了。

2)得到有用的系统/内核信息
proc
文件系统可以被用于收集有用的关于系统和运行中的内核的信息。下面是一些重要的文件:
    * /proc/cpuinfo - CPU
的信息 (型号, 家族, 缓存大小等)
    * /proc/meminfo -
物理内存、交换空间等的信息
    * /proc/mounts -
已加载的文件系统的列表
    * /proc/devices -
可用设备的列表
    * /proc/filesystems -
被支持的文件系统
    * /proc/modules -
已加载的模块
    * /proc/version -
内核版本
    * /proc/cmdline -
系统启动时输入的内核命令行参数
proc
中的文件远不止上面列出的这么多。想要进一步了解的读者可以对 /proc 的每一个文件都'more'一下或读参考文献[1]获取更多的有关 /proc 目录中的文件的信息。建议使用'more'而不是'cat',除非你知道这个文件很小,因为有些文件 (比如 kcore) 可能会非常长。

3proc的文件的打开关闭及读取

/pro中的文件可以象普通的ASCII文件一样进行读取,为了读取一个伪文件的内容,可以打开文件然后使用stdio程序库中的例程如fgets()或者fsacnf()来读取文件。下面是实验中一个读取/proc/sys/kernel/hostname的例子:

      FILE *thisProcFile = NULL;

thisProcFile = fopen( "/proc/sys/kernel/hostname", "r"  );

      fgets( lineBuf, LB_SIZE + 1, thisProcFile );

      printf( "Machine hostname: %s", lineBuf );

      fclose( thisProcFile );

 

 

2.实验中使用的一些linux函数和c函数及方法

1linux函数—time()ctime()

要输出系统当前的时间,可以使用下面两个函数

 #innclude

 time_t time(time_t *tloc);

 char *ctime(const time_t *clock);

 

time函数返回从1970110点以来的秒数.存储在time_t结构之中.不过这个函数的返

回值对于我们来说没有什么实际意义.这个时候我们使用第二个函数将秒数转化为字符串

. 这个函数的返回类型是固定的:一个可能值为. Thu Dec 7 14:58:59 2006 这个字符串

的长度是固定的为26

2c语言中的argcargv

一个c程序可能具有以下形式的头部:

int main( int argc, char *argv[])

如果不向shell传递参数,可以省略这两个参数,

Argc的含义是所输入的文件名和参数的个数,argv[0]则指向文件名argv[]其他则指向参数,比如observer –l 10 600

Argc = 4, argv[0] = “observer”, argv[1]= “-l”……

现在c主程序可以采用如下方式引用这些参数:

      int main( int argc, char *argv[] )

//决定报告类型

      reportType = STANDARD;

      strcpy( repTypeName, "Standard" );

      if ( argc > 1)

      {

             sscanf( argv[1], "%c%c", &c1, &c2 );

      }

      if ( c1 != '-')

      {

             fprintf(stderr, "usage: observer [-s][-l int dur]\n" );

             exit(1);

      }

      if ( c2 == 's' )

      {

             reportType = SHORT;

             strcpy( repTypeName, "Short" );

      }

      if ( c2 == 'l' )

      {

             reportType = LONG;

             strcpy( repTypeName, "Long" );

             interval = atoi( argv[2] );

             duration = atoi( argv[3] );

      }

3)c中的一些函数

<1>转换函数

atoi函数:把字符串转换成整型数

相关函数  atoiatolstrtodstrtolstrtoul

表头文件  #include

定义函数  int atof(const char *nptr);

<2>输入输出函数

—printf(),sprintf(),sscanf(),gets(),getch(),scanf()puts()

<3>文件操作函数

—fopen(),fclose(),fgets(),fputs(),fscanf(),fprintf(),fgetc(),fputc(),freal(),fwrite()

 

结论:

/proc文件系统提供了一个基于文件的Linux内部接口。它可以用于确定系统的各种不同设备和进程的状态。

C函数库和linux函数库定义了很多关于各种操作的函数,可以利用它们来实现对/proc的读取和修改。

阅读(832) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~