理解/proc文件系统Windows系统

肌肉妈宝叫屁桃 分享 时间: 收藏本文

【简介】感谢网友“肌肉妈宝叫屁桃”参与投稿,下面是小编整理的理解/proc文件系统Windows系统(共10篇),欢迎阅读分享,希望对大家有所帮助。

篇1:理解/proc文件系统Windows系统

(这个是,希望给大家提供帮助,更好地理解/proc文件系统) 不只一次的有人问我关于/proc文件系统,那是什么,那些巨大的文件在那里做什么?我可以删除它们吗?本文将详细介绍/proc文件系统,描述一些工具,你可以通过这些工具领略/proc的威力,最后有一

(这个是转贴,希望给大家提供帮助,更好地理解/proc文件系统)

不只一次的有人问我关于/proc文件系统,那是什么,那些巨大的文件在那里做什么?我可以删除它们吗?本文将详细介绍/proc文件系统,描述一些工具,你可以通过这些工具领略/proc的威力。最后有一个例子程序,演示了系统管理员如何与/proc交互。

◆ 介绍/proc

在过去那些糟糕的日子里,只能通过直接访问内核内存(/dev/kmem)获取进程数据,比如运行ps(1)命令时。为了实现这种访问,需要超级用户权限,而且步骤相当复杂。Sun公司从UNIXSVR4开始解决了进程数据访问问题,现在,可以简单地通过/proc访问进程数据。

/proc文件系统不是普通意义上的文件系统,它是一个到运行中进程地址空间的访问接口。通过/proc,可以用标准Unix系统调用(比如open、read()、write()、ioctl()等等)访问进程地址空间。事实上,Solaris ps(1)命令正是利用/proc获取进程状态。

S (l) 进程状态:

O    正在运行

S    休眠: 进程正在等待某个事件发生/完成

R    可运行: 进程位于运行队列中

Z    僵尸状态:  进程结束了,但是其父进程未处理SIGCHLD信号

T    进程暂停: 可能是任务控制信号所致,或者正在被

跟踪调试

/proc下的大文件对应运行中进程的地址空间,不是标准Unix文件。事实上每个文件名对应运行中进程的PID,文件属主、属组对应进程拥有者的real-uid和primary-gid。权限控制与普通Unix文件一样。文件大小是最令人迷惑的地方,事实上相当好理解,对应进程内存映像大小,并不真正占用硬盘空间,所以你不必担心空间浪费的问题。不要企图删除这些文件!观察图A中列举的/proc例子:

--------------------------------------------------------------------------

$ ls -l /proc

total 43384

-rw-------   1 root     root           0 Apr  2 20:07 00000

-rw-------   1 root     root      393216 Apr  2 20:07 00001

-rw-------   1 root     root           0 Apr  2 20:07 00002

-rw-------   1 root     root           0 Apr  2 20:07 00003

-rw-------   1 root     root     1695744 Apr  2 20:07 00081

-rw-------   1 root     root     1597440 Apr  2 20:07 00083

-rw-------   1 root     root     1777664 Apr  2 20:08 00096

-rw-------   1 root     root     1683456 Apr  2 20:08 00099

-rw-------   1 root     root     1589248 Apr  2 20:08 00101

-rw-------   1 root     root     1445888 Apr  2 20:08 00116

-rw-------   1 root     root     1404928 Apr  2 20:08 00126

-rw-------   1 root     root      798720 Apr  2 20:08 00135

-rw-------   1 root     root     1368064 Apr  2 20:08 00195

-rw-------   1 root     root     1585152 Apr  2 20:08 00197

-rw-------   1 root     root     1368064 Apr  2 20:08 00200

-rw-------   1 root     other     225280 Apr  2 20:08 00201

-rw-------   1 root     root     1454080 Apr  2 20:08 00203

-rw-------   1 root     root     1519616 Apr  2 20:14 00243

-rw-------   1 rthomas  wheel    1499136 Apr  2 20:14 00245

-rw-------   1 rthomas  wheel     806912 Apr  2 20:16 00261

$

图A: /proc例子

--------------------------------------------------------------------------

操作/proc下文件的方式和操作普通Unix文件一样,可以使用所有你熟悉的系统调用,包括ioctl()。在内核中,针对/proc下文件的vnode操作被转向procfs。这意味着操作vnode的系统调用(比如lookuppn())实际上最终转向procfs-savvy系统调用(比如prlookup())。

◆ /proc能告诉我什么

Solaris下使用/proc的工具相当完善,位于/usr/proc/bin目录中。这些工具提供了一种访问任意指定进程临界数据的简捷办法。比如,想知道一个进程已经打开了多少文件,你可以使用crash(1M)(见鬼,我不会),但是你是root吗?不必担心,可以用/usr/proc/bin/pfiles获取这种信息,图B演示了pfiles(1)命令的使用:

--------------------------------------------------------------------------

[scz@ /export/home/scz]> ps

PID TTY      TIME CMD

637 pts/3    0:00 bash

[scz@ /export/home/scz]> pfiles 637

637:    -bash

Current rlimit: 64 file descriptors

0: S_IFCHR mode:0620 dev:151,0 ino:196787 uid:500 gid:7 rdev:24,3

O_RDWR

1: S_IFCHR mode:0620 dev:151,0 ino:196787 uid:500 gid:7 rdev:24,3

O_RDWR

2: S_IFCHR mode:0620 dev:151,0 ino:196787 uid:500 gid:7 rdev:24,3

O_RDWR

3: S_IFDOOR mode:0444 dev:191,0 ino:1618164880 uid:0 gid:0 size:0

O_RDONLY|O_LARGEFILE FD_CLOEXEC  door to nscd[213]

63: S_IFCHR mode:0620 dev:151,0 ino:196787 uid:500 gid:7 rdev:24,3

O_RDWR FD_CLOEXEC

[scz@ /export/home/scz]>

图B: 使用pfiles(1)命令

--------------------------------------------------------------------------

正如上面演示的,/usr/proc/bin下的命令使用很简单,只需要在命令行上指定PID。然而,留心权限许可设置,与所有普通Unix文件一样,你无权访问那些权限设置上禁止访问的指定PID的进程数据。

花点事件看看proc(1)手册页,熟悉其中介绍的命令,你将学会列举指定进程相关的库、进程信号设置、进程信任设置,你甚至可以暂停、重启进程,

◆ 编写/proc工具

/proc的魅力在于它包含了你可能想知道的关于一个进程的任何信息,你只需要简单地从中获取。/usr/include/sys/procfs.h文件中定义了两个结构,prstatus和prpsinfo,从中可以获取指定进程的很多信息。下面是个例子,开发者想知道他的应用程序究竟占用了多少内存。简单!ls /proc就可以知道了。但是,他还想知道更多细节,他需要知道总的映像大小、常驻部分的大小、堆区(heap)大小、栈区(stack)大小。此外,他希望能够定期跟踪这些数据信息,类似vmstat(1M)那种方式。如上所述,听起来象是一个令人生畏的任务。

译者: Solaris 2.6开始这两个结构定义在/usr/include/sys/old_procfs.h文件中

然而,通过使用/proc文件系统,我们可以使这项编程挑战变得容易些。我们写的这个工具称做memlook,将显示指定PID对应的内存统计信息。此外,可以在命令行上指定一个时间间隔,以便定期重新检测内存利用信息。图C演示了一次简单的输出:

--------------------------------------------------------------------------

$ memlook 245

PID     IMAGE           RSS             HEAP            STACK

245     1499136         1044480         24581           8192

$

图C: memlook的输出举例

--------------------------------------------------------------------------

下面是memlook.c的源代码

--------------------------------------------------------------------------

/*

* @(#)memlook.c 1.0 10 Nov 

* Robert Owen Thomas robt@cymru.com

* memlook.c -- A process memory utilization reporting tool.

*

* gclearcase/“ target=”_blank“ >cc-Wall -O3 -o memlook memlook.c

*/

#pragma ident ”@(#)memlook.c 1.0 10 Nov 1997 Robert Owen Thomas robt@cymru.com“

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

int counter = 10;

int  showUsage ( const char * );

void getInfo   ( int, int );

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

{

int  fd, pid, timeloop = 0;

char pidpath[BUFSIZ];  /* /usr/include/stdio.h: #define BUFSIZ 1024 */

switch ( argc )

{

case 2:

break;

case 3:

timeloop = atoi( argv[2] );

break;

default:

showUsage( argv[0] );

break;

}  /* end of switch */

pid = atoi( argv[1] );

sprintf( pidpath, ”/proc/%-d“, pid );  /* -表示向左靠 */

if ( ( fd = open( pidpath, O_RDONLY ) ) < 0 )

{

perror( pidpath );

exit( 1 );

}

if ( 0 < timeloop )

{

for ( ; ; )

{

getInfo( fd, pid );

sleep( timeloop );

}

}

getInfo( fd, pid );

close( fd );

exit( 0 );

}  /* end of main */

int showUsage ( const char * progname )

{

fprintf( stderr, ”%s: usage: %s < PID > [time delay]n“, progname, progname );

exit( 3 );

}  /* end of showUsage */

void getInfo ( int fd, int pid )

{

prpsinfo_t prp;

prstatus_t prs;

if ( ioctl( fd, PIOCPSINFO, &prp ) < 0 )

{

perror( ”ioctl“ );

exit( 5 );

}

if ( ioctl( fd, PIOCSTATUS, &prs ) < 0 )

{

perror( ”ioctl“ );

exit( 7 );

}

if ( counter > 9 )

{

fprintf( stdout, ”PIDtIMAGEttRSSttHEAPttSTACKn“ );

counter = 0;

}

fprintf( stdout, ”%ut%-9ut%-9ut%-15ut%-15un“, pid,

( unsigned int )prp.pr_bysize, ( unsigned int )prp.pr_byrssize,

( unsigned int )prs.pr_brksize, ( unsigned int )prs.pr_stksize );

counter++;

}  /* end of getInfo */

--------------------------------------------------------------------------

译者: 作者这里利用了ioctl(),而不是直接读取/proc下文件,这样做的好处在于即使系统升级后/proc布局改变,内核中相应ioctl cmd支持也随之改变,对于应用层的开发者,接口一样,源代码可平稳移植。事实上从作者前面举例来看, memlook.c是在Solaris 2.6以前的版本上开发的,但我并未修改就可以直接用在Solaris 2.6上,虽然此时/proc布局已经发生重大变化。

仔细阅读prstatus和prpsinfo结构,寻找那些你敢兴趣的成员。在未能真正掌握这种技术之前不要针对/proc文件系统使用write()或者ioctl()。针对特定进程胡乱做write()调用,结果未知。

◆ 结论

当痛苦调试程序或者试图获取指定进程状态的时候,/proc文件系统将是你强有力的支持者。通过它可以创建更强大的工具,获取更多信息。

:em02:  :em02:  :em02:  :em02:  :em02:  :em02:

climbmount 回复于:-12-18 13:26:45好文章,来得真及时。

.netfrihor 回复于:2004-12-18 16:00:04不错

顶一下

急不通 回复于:2004-12-21 09:41:24好文。bye the way,在linux下面的/proc也是类似的吗?

飞天二狭 回复于:2004-12-21 22:40:56linux下面当然有了。

原文转自:www.ltesting.net

篇2:理解 Proc 文件系统Unix系统

/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 文件系统才根据内核中的信息建立相应的文件和目录。

篇3:理解 Proc 文件系统Unix系统

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

mount -t proc proc /proc

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

篇4:理解 Proc 文件系统Unix系统

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) 可能会非常长。

篇5:理解 Proc 文件系统Unix系统

/proc 文件系统可以用于获取运行中的进程的信息。在 /proc 中有一些编号的子目录。每个编号的目录对应一个进程 id (PID)。这样,每一个运行中的进程 /proc 中都有一个用它的 PID 命名的目录。这些子目录中包含可以提供有关进程的状态和环境的重要细节信息的文件。让我们试着查找一个运行中的进程。

$ ps -aef | grep mozillaroot 32558 32425 8 22:53 pts/1 00:01:23 /usr/bin/mozilla上述命令显示有一个正在运行的 mozilla 进程的 PID 是 32558。相对应的,/proc 中应该有一个名叫 32558 的目录

$ ls -l /proc/32558total 0-r--r--r-- 1 root root0 Dec 25 22:59 cmdline-r--r--r-- 1 root root0 Dec 25 22:59 cpulrwxrwxrwx 1 root root0 Dec 25 22:59 cwd -> /proc/-r-------- 1 root root0 Dec 25 22:59 environlrwxrwxrwx 1 root root0 Dec 25 22:59 exe -> /usr/bin/mozilla*dr-x------ 2 root root0 Dec 25 22:59 fd/-r--r--r-- 1 root root0 Dec 25 22:59 maps-rw------- 1 root root0 Dec 25 22:59 mem-r--r--r-- 1 root root0 Dec 25 22:59 mountslrwxrwxrwx 1 root root0 Dec 25 22:59 root -> //-r--r--r-- 1 root root0 Dec 25 22:59 stat-r--r--r-- 1 root root0 Dec 25 22:59 statm-r--r--r-- 1 root root0 Dec 25 22:59 status

文件 ”cmdline“ 包含启动进程时调用的命令行。”envir“ 进程的环境变两。 ”status“ 是进程的状态信息,包括启动进程的用户的用户ID (UID) 和组ID(GID) ,父进程ID (PPID),还有进程当前的状态,比如”Sleelping“和”Running“。每个进程的目录都有几个符号链接,”cwd“是指向进程当前工作目录的符号链接,”exe“指向运行的进程的可执行程序,”root“指向被这个进程看作是根目录的目录 (通常是”/“)。目录”fd“包含指向进程使用的文件描述符的链接。 ”cpu“仅在运行 SMP 内核时出现,里面是按 CPU 划分的进程时间。

/proc/self是一个有趣的子目录,它使得程序可以方便地使用 /proc 查找本进程地信息。/proc/self 是一个链接到 /proc 中访问 /proc 的进程所对应的 PID 的目录的符号链接。

篇6:理解 Proc 文件系统Unix系统

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

$ ls -l /proc/cpuinfo-r--r--r-- 1 root root 0 Dec 25 11:01 /proc/cpuinfo$ file /proc/cpuinfo/proc/cpuinfo: empty$ cat /proc/cpuinfoprocessor : 0vendor_id : GenuineIntelcpu family: 6model : 8model name: Pentium III (Coppermine)stepping : 6cpu MHz : 1000.119cache size: 256 KBfdiv_bug: nohlt_bug : nosep_bug : nof00f_bug : nocoma_bug : nofpu : yesfpu_exception : yescpuid level : 2wp : yesflags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mcacmov pat pse36 mmx fxsr xmmbogomips : .85processor : 3vendor_id : GenuineIntelcpu family: 6model : 8model name: Pentium III (Coppermine)stepping : 6cpu MHz : 1000.119cache size: 256 KBfdiv_bug : nohlt_bug : nosep_bug : nof00f_bug : nocoma_bug : nofpu : yesfpu_exception : yescpuid level : 2wp : yesflags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mcacmov pat pse36 mmx fxsr xmmbogomips : 1992.29

这是一个从双 CPU 的系统中得到的结果,上述大部分的信息十分清楚地给出了这个系统的有用的硬件信息。有些 /proc 的文件是经过编码的,不同的工具可以被用来解释这些编码过的信息并输出成可读的形式。这样的工具包括:'top', 'ps', 'apm' 等。

篇7:理解 Proc 文件系统Unix系统

上面讨论的大部分 /proc 的文件是只读的。而实际上 /proc 文件系统通过 /proc 中可读写的文件提供了对内核的交互机制。写这些文件可以改变内核的状态,因而要慎重改动这些文件。/proc/sys 目录存放所有可读写的文件的目录,可以被用于改变内核行为。

/proc/sys/kernel- 这个目录包含反通用内核行为的信息。 /proc/sys/kernel/{domainname, hostname} 存放着机器/网络的域名和主机名。这些文件可以用于修改这些名字。

$ hostnamemachinename.domainname.com$ cat /proc/sys/kernel/domainnamedomainname.com$ cat /proc/sys/kernel/hostnamemachinename$ echo ”new-machinename“ > /proc/sys/kernel/hostname$ hostnamenew-machinename.domainname.com这样,通过修改 /proc 文件系统中的文件,我们可以修改主机名。很多其他可配置的文件存在于 /proc/sys/kernel/。这里不可能列出所有这些文件,读者可以自己去这个目录查看以得到更多细节信息。

另一个可配置的目录是/proc/sys.net。这个目录中的文件可以用于修改机器/网络的网络属性。比如,简单修改一个文件,你可以在网络上瘾藏匿的计算机。

$ echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all

这将在网络上瘾藏你的机器,因为它不响应 icmp_echo。主机将不会响应其他主机发出的 ping 查询。

$ ping machinename.domainname.comno answer from machinename.domainname.com

要改回缺省设置,只要

$ echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all

/proc/sys 下还有许多其它可以用于改变内核属性。读者可以通过参考文献 [1], [2] 获取更多信息。

篇8:/proc文件系统入门Unix系统

理解/proc文件系统 理解/proc文件系统 ◆ 介绍/proc 在过去那些糟糕的日子里,只能通过直接访问内核内存(/dev/kmem)获取进程数据,比如运行ps(1)命令时,为了实现这种访问,需要超级用户权限,而且步骤相当复杂。Sun公司从 UNIX SVR4开始解决了进程数据访问

理解/proc文件系统

理解/proc文件系统


◆ 介绍/proc

在过去那些糟糕的日子里,只能通过直接访问内核内存(/dev/kmem)获取进程数据,比如运行ps(1)命令时。为了实现这种访问,需要超级用户权限,而且步骤相当复杂。Sun公司从UNIXSVR4开始解决了进程数据访问问题,现在,可以简单地通过/proc访问进程数据。

/proc文件系统不是普通意义上的文件系统,它是一个到运行中进程地址空间的访问接口。通过/proc,可以用标准Unix系统调用(比如open、read()、write()、ioctl()等等)访问进程地址空间。事实上,Solaris ps(1)命令正是利用/proc获取进程状态。

S (l) 进程状态:

O 正在运行

S 休眠: 进程正在等待某个事件发生/完成

R 可运行: 进程位于运行队列中

Z 僵尸状态: 进程结束了,但是其父进程未处理SIGCHLD信号

T 进程暂停: 可能是任务控制信号所致,或者正在被

跟踪调试

/proc下的大文件对应运行中进程的地址空间,不是标准Unix文件。事实上每个文件名对应运行中进程的PID,文件属主、属组对应进程拥有者的real-uid和primary-gid。权限控制与普通Unix文件一样。文件大小是最令人迷惑的地方,事实上相当好理解,对应进程内存映像大小,并不真正占用硬盘空间,所以你不必担心空间浪费的问题。不要企图删除这些文件!观察图A中列举的/proc例子:

--------------------------------------------------------------------------

$ ls -l /proc

total 43384

-rw------- 1 root root 0 Apr 2 20:07 00000

-rw------- 1 root root 393216 Apr 2 20:07 00001

-rw------- 1 root root 0 Apr 2 20:07 00002

-rw------- 1 root root 0 Apr 2 20:07 00003

-rw------- 1 root root 1695744 Apr 2 20:07 00081

-rw------- 1 root root 1597440 Apr 2 20:07 00083

-rw------- 1 root root 1777664 Apr 2 20:08 00096

-rw------- 1 root root 1683456 Apr 2 20:08 00099

-rw------- 1 root root 1589248 Apr 2 20:08 00101

-rw------- 1 root root 1445888 Apr 2 20:08 00116

-rw------- 1 root root 1404928 Apr 2 20:08 00126

-rw------- 1 root root 798720 Apr 2 20:08 00135

-rw------- 1 root root 1368064 Apr 2 20:08 00195

-rw------- 1 root root 1585152 Apr 2 20:08 00197

-rw------- 1 root root 1368064 Apr 2 20:08 00200

-rw------- 1 root other 225280 Apr 2 20:08 00201

-rw------- 1 root root 1454080 Apr 2 20:08 00203

-rw------- 1 root root 1519616 Apr 2 20:14 00243

-rw------- 1 rthomas wheel 1499136 Apr 2 20:14 00245

-rw------- 1 rthomas wheel 806912 Apr 2 20:16 00261

$

图A: /proc例子

--------------------------------------------------------------------------

操作/proc下文件的方式和操作普通Unix文件一样,可以使用所有你熟悉的系统调用,包括ioctl()。在内核中,针对/proc下文件的vnode操作被转向procfs。这意味着操作vnode的系统调用(比如lookuppn())实际上最终转向procfs-savvy系统调用(比如prlookup())。

◆ /proc能告诉我什么

Solaris下使用/proc的工具相当完善,位于/usr/proc/bin目录中。这些工具提供了一种访问任意指定进程临界数据的简捷办法。比如,想知道一个进程已经打开了多少文件,你可以使用crash(1M)(见鬼,我不会),但是你是root吗?不必担心,可以用/usr/proc/bin/pfiles获取这种信息,图B演示了pfiles(1)命令的使用:

--------------------------------------------------------------------------

[scz@ /export/home/scz]> ps

PID TTY TIME CMD

637 pts/3 0:00 bash

[scz@ /export/home/scz]> pfiles 637

637: -bash

Current rlimit: 64 file descriptors

0: S_IFCHR mode:0620 dev:151,0 ino:196787 uid:500 gid:7 rdev:24,3

O_RDWR

1: S_IFCHR mode:0620 dev:151,0 ino:196787 uid:500 gid:7 rdev:24,3

O_RDWR

2: S_IFCHR mode:0620 dev:151,0 ino:196787 uid:500 gid:7 rdev:24,3

O_RDWR

3: S_IFDOOR mode:0444 dev:191,0 ino:1618164880 uid:0 gid:0 size:0

O_RDONLY|O_LARGEFILE FD_CLOEXEC door to nscd[213]

63: S_IFCHR mode:0620 dev:151,0 ino:196787 uid:500 gid:7 rdev:24,3

O_RDWR FD_CLOEXEC

[scz@ /export/home/scz]>

图B: 使用pfiles(1)命令

--------------------------------------------------------------------------

正如上面演示的,/usr/proc/bin下的命令使用很简单,只需要在命令行上指定PID。然而,留心权限许可设置,与所有普通Unix文件一样,你无权访问那些权限设置上禁止访问的指定PID的进程数据。

花点事件看看proc(1)手册页,熟悉其中介绍的命令,你将学会列举指定进程相关的库、进程信号设置、进程信任设置,你甚至可以暂停、重启进程。

◆ 编写/proc工具

/proc的魅力在于它包含了你可能想知道的关于一个进程的任何信息,你只需要简单地从中获取。/usr/include/sys/procfs.h文件中定义了两个结构,prstatus和prpsinfo,从中可以获取指定进程的很多信息。下面是个例子,开发者想知道他的应用程序究竟占用了多少内存。简单!ls /proc就可以知道了。但是,他还想知道更多细节,他需要知道总的映像大小、常驻部分的大小、堆区(heap)大小、栈区(stack)大小,

此外,他希望能够定期跟踪这些数据信息,类似vmstat(1M)那种方式。如上所述,听起来象是一个令人生畏的任务。

译者: Solaris 2.6开始这两个结构定义在/usr/include/sys/old_procfs.h文件中

然而,通过使用/proc文件系统,我们可以使这项编程挑战变得容易些。我们写的这个工具称做memlook,将显示指定PID对应的内存统计信息。此外,可以在命令行上指定一个时间间隔,以便定期重新检测内存利用信息。图C演示了一次简单的输出:

--------------------------------------------------------------------------

$ memlook 245

PID IMAGE RSS HEAP STACK

245 1499136 1044480 24581 8192

$

图C: memlook的输出举例

--------------------------------------------------------------------------

下面是memlook.c的源代码

--------------------------------------------------------------------------

/*

* @(#)memlook.c 1.0 10 Nov

* Robert Owen Thomas robt@cymru.com

* memlook.c -- A process memory utilization reporting tool.

*

* gcc -Wall -O3 -o memlook memlook.c

*/

#pragma ident ”@(#)memlook.c 1.0 10 Nov 1997 Robert Owen Thomas robt@cymru.com“

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

int counter = 10;

int showUsage ( const char * );

void getInfo ( int, int );

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

{

int fd, pid, timeloop = 0;

char pidpath[BUFSIZ]; /* /usr/include/stdio.h: #define BUFSIZ 1024 */

switch ( argc )

{

case 2:

break;

case 3:

timeloop = atoi( argv[2] );

break;

default:

showUsage( argv[0] );

break;

} /* end of switch */

pid = atoi( argv[1] );

sprintf( pidpath, ”/proc/%-d“, pid ); /* -表示向左靠 */

if ( ( fd = open( pidpath, O_RDONLY ) ) < 0 )

{

perror( pidpath );

exit( 1 );

}

if ( 0 < timeloop )

{

for ( ; ; )

{

getInfo( fd, pid );

sleep( timeloop );

}

}

getInfo( fd, pid );

close( fd );

exit( 0 );

} /* end of main */

int showUsage ( const char * progname )

{

fprintf( stderr, ”%s: usage: %s < PID > [time delay]n“, progname, progname );

exit( 3 );

} /* end of showUsage */

void getInfo ( int fd, int pid )

{

prpsinfo_t prp;

prstatus_t prs;

if ( ioctl( fd, PIOCPSINFO, &prp ) < 0 )

{

perror( ”ioctl“ );

exit( 5 );

}

if ( ioctl( fd, PIOCSTATUS, &prs ) < 0 )

{

perror( ”ioctl“ );

exit( 7 );

}

if ( counter > 9 )

{

fprintf( stdout, ”PIDtIMAGEttRSSttHEAPttSTACKn“ );

counter = 0;

}

fprintf( stdout, ”%ut%-9ut%-9ut%-15ut%-15un“, pid,

( unsigned int )prp.pr_bysize, ( unsigned int )prp.pr_byrssize,

( unsigned int )prs.pr_brksize, ( unsigned int )prs.pr_stksize );

counter++;

} /* end of getInfo */

--------------------------------------------------------------------------

译者: 作者这里利用了ioctl(),而不是直接读取/proc下文件,这样做的好处在于即使系统升级后/proc布局改变,内核中相应ioctl cmd支持也随之改变,对于应用层的开发者,接口一样,源代码可平稳移植。事实上从作者前面举例来看, memlook.c是在Solaris 2.6以前的版本上开发的,但我并未修改就可以直接用在Solaris 2.6上,虽然此时/proc布局已经发生重大变化。

仔细阅读prstatus和prpsinfo结构,寻找那些你敢兴趣的成员。在未能真正掌握这种技术之前不要针对/proc文件系统使用write()或者ioctl()。针对特定进程胡乱做write()调用,结果未知。

◆ 结论

当痛苦调试程序或者试图获取指定进程状态的时候,/proc文件系统将是你强有力的支持者。通过它可以创建更强大的工具,获取更多信息。

:www.51tech.net/news_html/1607.htm

原文转自:www.ltesting.net

篇9:/proc 一个伪文件系统Unix系统

bbs.chinaunix.net/forum/viewtopic.php?t=487572show_type= agsp# ls -l /proc/curproc/ total 0 -r--r--r-- 1 root wheel 0 Jan 23 16:02 cmdline --w------- 1 root wheel 0 Jan 23 16:02 ctl -rw------- 1 root wheel 32 Jan 23 16:02 dbregs -r-

bbs.chinaunix.net/forum/viewtopic.php?t=487572&show_type=

agsp# ls -l /proc/curproc/

total 0

-r--r--r-- 1 root wheel   0 Jan 23 16:02 cmdline

--w------- 1 root wheel   0 Jan 23 16:02 ctl

-rw------- 1 root wheel  32 Jan 23 16:02 dbregs

-r--r--r-- 1 root wheel   0 Jan 23 16:02 etype

lr-xr-xr-x 1 root wheel   7 Jan 23 16:02 file -> /bin/ls

-rw------- 1 root wheel 176 Jan 23 16:02 fpregs

-r--r--r-- 1 root wheel   0 Jan 23 16:02 map

-rw------- 1 root wheel   0 Jan 23 16:02 mem

--w------- 1 root wheel   0 Jan 23 16:02 note

--w------- 1 root wheel   0 Jan 23 16:02 notepg

-rw------- 1 root wheel  76 Jan 23 16:02 regs

-r--r--r-- 1 root wheel   0 Jan 23 16:02 rlimit

-r--r--r-- 1 root wheel   0 Jan 23 16:02 status

/proc 一个伪文件系统,作为系统内核进程表的一个镜像,从这里,可以查看当前系统中的所有进程的有关信息,

/proc 一个伪文件系统Unix系统

原文转自:www.ltesting.net

篇10:ReiserFS文件系统Windows系统

1. 什么是ReiserFS ReiserFS是一种新型的文件系统,在蓝点 Linux 中你可以选择它来装载你的Linux操作系统和其他应用程序和数据文件,它通过一种与众不同的方式--完全平衡树结构来容纳数据,包括文件数据,文件名以及日志支持。ReiserFS还以支持海量磁盘和磁

1. 什么是ReiserFS

ReiserFS是一种新型的文件系统,在蓝点Linux中你可以选择它来装载你的Linux操作系统和其他应用程序和数据文件。它通过一种与众不同的方式--完全平衡树结构来容纳数据,包括文件数据,文件名以及日志支持。ReiserFS还以支持海量磁盘和磁盘阵列,并能在上面继续保很快的搜索速度和很高的效率。ReiserFS文件系统一直以来被用在高端Unix系统上如SGI等。

2. ReiserFS的特点(与ext2的对比):

ReiserFS相对于Linux上传统的文件系统--ext2有很多优点,在下面一一介绍。

搜寻方式

ReiserFS是基于平衡树的文件系统结构,尤其对于大量文件的巨型文件系统,如服务器上的文件系统,搜索速度要比ext2快;ext2使用局部的二分查找法,综合性能比不上ReiserFS。

空间分配和利用情况

ReiserFS里的目录是完全动态分配的,因此不存在ext2中常见的无法回收巨型目录占用的磁盘空间的情况。ReiserFS里小文件(<4K)可以直接存储进树,小文件读取和写入的速度更快,树内节点是按字节对齐的,小的文件可共享同一个硬盘块,节约大量空间。Ext2使用固定大小的块分配策略,也就是说,不到4K的小文件也要占据4K的空间,导致的空间浪费比较严重。

先进的日志机制

ReiserFS有先进的日志(Journaling/logging)机制,在系统意外崩溃的时候,未完成的文件操作不会影响到整个文件系统结构的完整性。 ext2虽然健壮性很强,但一旦文件系统被不正常地断开,在下一次启动时它将不得不进行漫长的检查系统数据结构的完整性的过程,这是为了防止数据丢失而必需的操作。对于较大型的服务器文件系统,这种”文件系统检查“可能要持续好几个小时,在很多场合下这样长的时间是无法接受的。 解决这个问题的一种技术”日志文件系统"。在日志的帮助下,每个对数据结构的改变都被记录下来,日志在机制保证了在每个实际数据修改之前,相应的日志已经写入硬盘。正因为如此,在系统突然崩溃时,在下次启动几秒钟后就能恢复成一个完整的系统,系统也就能很快的使用了。

支持海量磁盘和优秀的综合性能

ReiserFS是一个相当现代化的文件系统,相比之下,ext2虽然性能已经很好了,但其设计还只是19世纪80年代的水准。ReiserFS的出现,使Linux拥有了像Irix/AIX那样的高档商用Unix才有的高级文件系统。ReiserFS可轻松管理上百G的文件系统,在企业级应用中有其用武之地,由于它的高效存储和快速小文件I/O特点,它在桌面系统上也表现出色:启动X窗口系统的时间ReiserFS比ext2少1/3,

而ext2则无法管理2G以上的单个文件,这也使得ReiserFS在某些大型企业级应用中比ext2要出色。

3.缺点

ReiserFS一个最受人批评的缺点是每升级一个版本,都将要将磁盘重新格式化一次,这个缺点也正在改进中。

4.ReiserFS的起源与未来

在1997年7月23日,Hans Reiser把他的基于平衡树结构的ReiserFS文件系统在网上公布 。 这是ReiserFS的第一次公开亮相。此后,ReiserFS一直在Hans Reiser和领导下的开发小组下开发和发展,SuSE Linux也对它的发展起了重大的帮助。由于ReiserFS有一些很有用的特性,更主要的是它比ext2fs要快得多,所以它很快被很多人使用。据说在Linux内核2.4.0以上的版本可能将采用ReiserFS作为它的文件系统。当前的ReiserFS只能在Intel结构体系上使用,但支持其他体系结构的ReiserFS版本也正在积极开发中。我们等待着更强大,兼容性更好的ReiseFS的到来。

附:怎样添加ReiserFS文件系统

简介

ReiserFS文件系统是一种新的linux文件系统。它通过一种与众不同的方式--完全平衡树结构来容纳数据, 包括文件数据,文件名以及日志支持,并能在上面继续保持很快的搜索速度和很高的效率。ReiserFS文件系统一直以来被用在高端Unix系统上如,SGI。

ReiserFS是在Hans Reiser和其领导下的开发小组下开发和发展,SuSE Linux也对它的发展起了重大的帮助。由于ReiserFS有一些很有用的特性,更主要的是它比ext2fs要快得多,所以它很快被很多人使用。据说在Linux内核2.4.0以上的版本可能将采用ReiserFS作为它的文件系统。当前的ReiserFS只能在Intel结构体系上使用,但支持其他体系结构的ReiserFS版本也正在积极开发中。我们等待着更强大,兼容性更好的 ReiseFS的到来。

安装

从www.devlinux.com/namesys下载reiserfs的补丁程序,要确保下载的补丁版本和你的kernel版本是一致的。

下载后用root身份登录进入系统,切换至/usr/src/linux目录,执行命令:

#gunzip /path/to/linux-2.2.16-reiserfs-3.5.22-patch.gz

#patch -p1 -i /path/to/linux-2.2.16-reiserfs-3.5.22-patch

在做完上面的两步后,重新编译kernel,将reiserfs编译进kernel或做成一个模块。

Reiserfs的相关应用程序在 /usr/src/linux/fs/reiserfs/utils 目录下。你可以用下面方法安装它们:

#mkdir bin

#make

#make install

最后,你可以用“fdisk”命令重新分区或用“mkreiserfs”命令重新格式化一个已经存在的分区。 指定reiserfs类型加载这个分区,如“mount -t reiserfs /dev/hda2 /download”,这样你就可以使用这个新的分区了。

原文转自:www.ltesting.net

相关专题 文件系统系统