分类: 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) 可能会非常长。
3)proc的文件的打开关闭及读取
/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函数及方法
1)linux函数—time()和ctime()
要输出系统当前的时间,可以使用下面两个函数
#innclude
time_t time(time_t *tloc);
char
*ctime(const time_t *clock);
time函数返回从
回值对于我们来说没有什么实际意义.这个时候我们使用第二个函数将秒数转化为字符串
. 这个函数的返回类型是固定的:一个可能值为. Thu Dec 7 14:58:59 2006 这个字符串
的长度是固定的为26。
2)c语言中的argc和argv
一个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函数:把字符串转换成整型数
相关函数 atoi,atol,strtod,strtol,strtoul
表头文件 #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的读取和修改。