文档库 最新最全的文档下载
当前位置:文档库 › 通过proc文件系统查看内核

通过proc文件系统查看内核

通过proc文件系统查看内核
通过proc文件系统查看内核

最初开发 /proc 文件系统是为了提供有关系统中进程的信息。但是由于这个文件系统非常有用,因此内核中的很多元素也开始使用它来报告信息,或启用动态运行时配置。

/proc 文件系统包含了一些目录(用作组织信息的方式)和虚拟文件。虚拟文件可以向用户呈现内核中的一些信息,也可以用作一种从用户空间向内核发送信息的手段。实际上我们并不会同时需要实现这两点,但是本文将向您展示如何配置这个文件系统进行输入和输出。

尽管像本文这样短小的一篇文章无法详细介绍 /proc 的所有用法,但是它依然对这两种用法进行了展示,从而可以让我们体会一下 /proc 是多么强大。清单 1 是对 /proc 中部分元素进行一次交互查询的结果。它显示的是 /proc 文件系统的根目录中的内容。注意,在左边是一系列数字编号的文件。每个实际上都是一个目录,表示系统中的一个进程。由于在 GNU/Linux 中创建的第一个进程是

init 进程,因此它的 process-id 为1。然后对这个目录执行一个 ls 命令,这会显示很多文件。每个文件都提供了有关这个特殊进程的详细信息。例如,要查看 init 的 command-line 项的内容,只需对 cmdline 文件执行 cat 命令。

/proc 中另外一些有趣的文件有:cpuinfo,它标识了处理器的类型和速度;pci,显示在 PCI 总线上找到的设备;modules,标识了当前加载到内核中的模块。

清单 1. 对 /proc 的交互过程

[root@plato]# ls /proc

1 2040 2347 2874 474 fb mdstat sys

104 2061 2356 2930 9 filesystems meminfo

sysrq-trigger

113 2073 2375 2933 acpi fs misc sysvipc 1375 21 2409 2934 buddyinfo ide modules tty 1395 2189 2445 2935 bus interrupts mounts uptime 1706 2201 2514 2938 cmdline iomem mtrr version 179 2211 2515 2947 cpuinfo ioports net vmstat 180 **** **** 3 crypto irq partitions

181 **** **** 3004 devices kallsyms pci

182 **** **** 3008 diskstats kcore self

2 2301 26

3 3056 dma kmsg slabinfo

2015 2311 2805 394 driver loadavg stat

2019 2337 2821 4 execdomains locks swaps

[root@plato 1]# ls /proc/1

auxv cwd exe loginuid mem oom_adj root statm task

cmdline environ fd maps mounts oom_score stat status wchan

[root@plato]# cat /proc/1/cmdline

init [5]

[root@plato]#

清单 2 展示了对 /proc 中的一个虚拟文件进行读写的过程。这个例子首先检查内核的 TCP/IP 栈中的 IP 转发的目前设置,然后再启用这种功能。

清单 2. 对 /proc 进行读写(配置内核)

[root@plato]# cat /proc/sys/net/ipv4/ip_forward

[root@plato]# echo "1" > /proc/sys/net/ipv4/ip_forward

[root@plato]# cat /proc/sys/net/ipv4/ip_forward

1

[root@plato]#

另外,我们还可以使用 sysctl 来配置这些内核条目。有关这个问题的更多信息,请参阅参考资料一节的内容。

顺便说一下,/proc 文件系统并不是 GNU/Linux 系统中的惟一一个虚拟文件系统。在这种系统上,sysfs是一个与 /proc 类似的文件系统,但是它的组织更好(从 /proc 中学习了很多教训)。不过 /proc 已经确立了自己的地位,因此即使 sysfs 与 /proc 相比有一些优点,/proc 也依然会存在。还有一个debugfs文件系统,不过(顾名思义)它提供的更多是调试接口。debugfs 的一个优点是它将一个值导出给用户空间非常简单(实际上这不过是一个调用而已)。

内核模块简介

可加载内核模块(LKM)是用来展示 /proc 文件系统的一种简单方法,这是因为这是一种用来动态地向 Linux 内核添加或删除代码的新方法。LKM 也是 Linux 内核中为设备驱动程序和文件系统使用的一种流行机制。

如果您曾经重新编译过 Linux 内核,就可能会发现在内核的配置过程中,有很多设备驱动程序和其他内核元素都被编译成了模块。如果一个驱动程序被直接编译到了内核中,那么即使这个驱动程序没有运行,它的代码和静态数据也会占据一部分空间。但是如果这个驱动程序被编译成一个模块,就只有在需要内存并将其加载到内核时才会真正占用内存空间。有趣的是,对于 LKM 来说,我们不会注意到有什么性能方面的差异,因此这对于创建一个适应于自己环境的内核来说是一种功能强大的手段,这样可以根据可用硬件和连接的设备来加载对应的模块。

下面是一个简单的 LKM,可以帮助您理解它与在 Linux 内核中看到的标准(非动态可加载的)代码之间的区别。清单 3 给出了一个最简单的 LKM。(可以从本文的下载一节中下载这个代码)。

清单 3 包括了必须的模块头(它定义了模块的 API、类型和宏)。然后使用MODULE_LICENSE 定义了这个模块使用的许可证。此处,我们定义的是GPL,从而防止会污染到内核。

清单 3 然后又定义了这个模块的 init 和 cleanup 函数。my_module_init 函数是在加载这个模块时被调用的,它用来进行一些初始化方面的工作。

my_module_cleanup 函数是在卸载这个模块时被调用的,它用来释放内存并清除这个模块的踪迹。注意此处 printk 的用法:这是内核的 printf 函数。KERN_INFO 符号是一个字符串,可以用来对进入内核回环缓冲区的信息进行过滤(非常类似于 syslog)。

最后,清单 3 使用 module_init 和 module_exit 宏声明了入口函数和出口函数。这样我们就可以按照自己的意愿来对这个模块的 init 和 cleanup 函数进行命名了,不过我们最终要告诉内核维护函数就是这些函数。

清单 3. 一个简单的但可以正常工作的 LKM(simple-lkm.c)

#include

/* Defines the license for this LKM */

MODULE_LICENSE("GPL");

/* Init function called on module entry */

int my_module_init( void )

{

printk(KERN_INFO "my_module_init called. Module is now loaded.\n"); return 0;

}

/* Cleanup function called on module exit */

void my_module_cleanup( void )

{

printk(KERN_INFO "my_module_cleanup called. Module is now unloaded.\n");

return;

}

/* Declare entry and exit functions */

module_init( my_module_init );

module_exit( my_module_cleanup );

清单 3 尽管非常简单,但它却是一个真正的 LKM。现在让我们对其进行编译并在一个 2.6 版本的内核上进行测试。2.6 版本的内核为内核模块的编译引入了

一种新方法,我发现这种方法比原来的方法简单了很多。对于文件

simple-lkm.c,我们可以创建一个 makefile,其惟一内容如下:

obj-m += simple-lkm.o

要编译 LKM,请使用 make 命令,如清单 4 所示。

清单 4. 编译 LKM

[root@plato]# make -C /usr/src/linux-`uname -r` SUBDIRS=$PWD modules make: Entering directory `/usr/src/linux-2.6.11'

CC [M] /root/projects/misc/module2.6/simple/simple-lkm.o

Building modules, stage 2.

MODPOST

CC /root/projects/misc/module2.6/simple/simple-lkm.mod.o

LD [M] /root/projects/misc/module2.6/simple/simple-lkm.ko

make: Leaving directory `/usr/src/linux-2.6.11'

[root@plato]#

结果会生成一个 simple-lkm.ko 文件。这个新的命名约定可以帮助将这些内核对象(LKM)与标准对象区分开来。现在可以加载或卸载这个模块了,然后可以查看它的输出。要加载这个模块,请使用 insmod 命令;反之,要卸载这个模块,请使用 rmmod 命令。lsmod 可以显示当前加载的 LKM(参见清单 5)。

清单 5. 插入、检查和删除 LKM

[root@plato]# insmod simple-lkm.ko

[root@plato]# lsmod

Module Size Used by

simple_lkm 1536 0

autofs4 26244 0

video 13956 0

button 5264 0

battery 7684 0

ac 3716 0

yenta_socket 18952 3

rsrc_nonstatic 9472 1 yenta_socket

uhci_hcd 32144 0

i2c_piix4 7824 0

dm_mod 56468 3

[root@plato]# rmmod simple-lkm

[root@plato]#

注意,内核的输出进到了内核回环缓冲区中,而不是打印到 stdout 上,这是因为 stdout 是进程特有的环境。要查看内核回环缓冲区中的消息,可以使用dmesg 工具(或者通过 /proc 本身使用 cat /proc/kmsg 命令)。清单 6 给出了 dmesg 显示的最后几条消息。

清单 6. 查看来自 LKM 的内核输出

[root@plato]# dmesg | tail -5

cs: IO port probe 0xa00-0xaff: clean.

eth0: Link is down

eth0: Link is up, running at 100Mbit half-duplex

my_module_init called. Module is now loaded.

my_module_cleanup called. Module is now unloaded.

struct proc_dir_entry *create_proc_entry( const char *name, mode_t mode, struct proc_dir_entry

*parent );

struct proc_dir_entry {

const char *name; // virtual file name

mode_t mode; // mode permissions

uid_t uid; // File's user id

gid_t gid; // File's group id

struct inode_operations *proc_iops; // Inode operations functions

struct file_operations *proc_fops; // File operations functions

struct proc_dir_entry *parent; // Parent directory

...

read_proc_t *read_proc; // /proc read function

write_proc_t *write_proc; // /proc write function

void *data; // Pointer to private data

atomic_t count; // use count

...

};

void remove_proc_entry( const char *name, struct proc_dir_entry

*parent );

稍后我们就可以看到如何使用 read_proc 和 write_proc 命令来插入对这个虚拟文件进行读写的函数。

要从 /proc 中删除一个文件,可以使用 remove_proc_entry 函数。要使用这个函数,我们需要提供文件名字符串,以及这个文件在 /proc 文件系统中的位置(parent)。这个函数原型如清单 7 所示。

parent 参数可以为 NULL(表示 /proc 根目录),也可以是很多其他值,这取决于我们希望将这个文件放到什么地方。表 1 列出了可以使用的其他一些父proc_dir_entry,以及它们在这个文件系统中的位置。

表 1. proc_dir_entry 快捷变量

proc_dir_entry 在文件系统中的位置

proc_root_fs /proc

proc_net /proc/net

proc_bus /proc/bus

proc_root_driver /proc/driver

回调函数

我们可以使用 write_proc 函数向 /proc 中写入一项。这个函数的原型如下:

int mod_write( struct file *filp, const char __user *buff,

unsigned long len, void *data );

filp 参数实际上是一个打开文件结构(我们可以忽略这个参数)。buff 参数是传递给您的字符串数据。缓冲区地址实际上是一个用户空间的缓冲区,因此我们不能直接读取它。len 参数定义了在 buff 中有多少数据要被写入。data 参数是一个指向私有数据的指针(参见清单 7)。在这个模块中,我们声明了一个这种类型的函数来处理到达的数据。

Linux 提供了一组 API 来在用户空间和内核空间之间移动数据。对于

write_proc 的情况来说,我们使用了 copy_from_user 函数来维护用户空间的数据。

读回调函数

我们可以使用 read_proc 函数从一个 /proc 项中读取数据(从内核空间到用户空间)。这个函数的原型如下:

int mod_read( char *page, char **start, off_t off,

int count, int *eof, void *data );

page 参数是这些数据写入到的位置,其中 count 定义了可以写入的最大字符数。在返回多页数据(通常一页是 4KB)时,我们需要使用 start 和 off 参数。当所有数据全部写入之后,就需要设置 eof(文件结束参数)。与 write 类似,data 表示的也是私有数据。此处提供的 page 缓冲区在内核空间中。因此,我们可以直接写入,而不用调用 copy_to_user。

其他有用的函数

我们还可以使用 proc_mkdir、symlinks 以及 proc_symlink 在 /proc 文件系统中创建目录。对于只需要一个 read 函数的简单 /proc 项来说,可以使用create_proc_read_entry,这会创建一个 /proc 项,并在一个调用中对

read_proc 函数进行初始化。这些函数的原型如清单 8 所示。

清单 8. 其他有用的 /proc 函数

/* Create a directory in the proc filesystem */

struct proc_dir_entry *proc_mkdir( const char *name,

struct proc_dir_entry *parent ); /* Create a symlink in the proc filesystem */

struct proc_dir_entry *proc_symlink( const char *name,

struct proc_dir_entry *parent, const char *dest );

/* Create a proc_dir_entry with a read_proc_t in one call */

struct proc_dir_entry *create_proc_read_entry( const char *name,

mode_t mode,

struct

proc_dir_entry *base,

read_proc_t

*read_proc,

void *data );

/* Copy buffer to user-space from kernel-space */

unsigned long copy_to_user( void __user *to,

const void *from,

unsigned long n );

/* Copy buffer to kernel-space from user-space */

unsigned long copy_from_user( void *to,

const void __user *from,

unsigned long n );

/* Allocate a 'virtually' contiguous block of memory */

void *vmalloc( unsigned long size );

/* Free a vmalloc'd block of memory */

void vfree( void *addr );

/* Export a symbol to the kernel (make it visible to the kernel) */ EXPORT_SYMBOL( symbol );

/* Export all symbols in a file to the kernel (declare before module.h) */

使用所分配并已经清空的 cookie_pot 内存,我们在 /proc 中创建了一个

proc_dir_entry 项,并将其称为fortune。当 proc_entry 成功创建之后,对自己的本地变量和 proc_entry 结构进行了初始化。我们加载了 /proc read 和write 函数(如清单 9 和清单 10 所示),并确定这个模块的所有者。cleanup 函数简单地从 /proc 文件系统中删除这一项,然后释放 cookie_pot 所占据的内存。

cookie_pot 是一个固定大小(4KB)的页,它使用两个索引进行管理。第一个是cookie_index,标识了要将下一个 cookie 写到哪里去。变量 next_fortune 标识了下一个 cookie 应该从哪里读取以便进行输出。在所有的 fortune 项都读取之后,我们简单地回到了 next_fortune。

清单 9. 模块的 init/cleanup 和变量

#include

#include

#include

#include

#include

#include

MODULE_LICENSE("GPL");

MODULE_DESCRIPTION("Fortune Cookie Kernel Module");

MODULE_AUTHOR("M. Tim Jones");

#define MAX_COOKIE_LENGTH PAGE_SIZE

static struct proc_dir_entry *proc_entry;

static char *cookie_pot; // Space for fortune strings

static int cookie_index; // Index to write next fortune

static int next_fortune; // Index to read next fortune

int init_fortune_module( void )

{

int ret = 0;

cookie_pot = (char *)vmalloc( MAX_COOKIE_LENGTH );

if (!cookie_pot) {

ret = -ENOMEM;

} else {

memset( cookie_pot, 0, MAX_COOKIE_LENGTH );

proc_entry = create_proc_entry( "fortune", 0644, NULL );

if (proc_entry == NULL) {

ret = -ENOMEM;

vfree(cookie_pot);

printk(KERN_INFO "fortune: Couldn't create proc entry\n");

} else {

cookie_index = 0;

next_fortune = 0;

proc_entry->read_proc = fortune_read;

proc_entry->write_proc = fortune_write;

proc_entry->owner = THIS_MODULE;

printk(KERN_INFO "fortune: Module loaded.\n");

}

}

return ret;

}

void cleanup_fortune_module( void )

{

remove_proc_entry("fortune", &proc_root);

vfree(cookie_pot);

printk(KERN_INFO "fortune: Module unloaded.\n");

}

module_init( init_fortune_module );

module_exit( cleanup_fortune_module );

向这个罐中新写入一个 cookie 非常简单(如清单 10 所示)。使用这个写入cookie 的长度,我们可以检查是否有这么多空间可用。如果没有,就返回

-ENOSPC,它会返回给用户空间。否则,就说明空间存在,我们使用

copy_from_user 将用户缓冲区中的数据直接拷贝到 cookie_pot 中。然后增大cookie_index(基于用户缓冲区的长度)并使用 NULL 来结束这个字符串。最后,返回实际写入 cookie_pot 的字符的个数,它会返回到用户进程。

清单 10. 对 fortune 进行写入操作所使用的函数

ssize_t fortune_write( struct file *filp, const char __user *buff,

unsigned long len, void *data )

{

int space_available = (MAX_COOKIE_LENGTH-cookie_index)+1;

if (len > space_available) {

printk(KERN_INFO "fortune: cookie pot is full!\n");

return -ENOSPC;

}

if (copy_from_user( &cookie_pot[cookie_index], buff, len )) {

return -EFAULT;

}

cookie_index += len;

cookie_pot[cookie_index-1] = 0;

return len;

}

对 fortune 进行读取也非常简单,如清单 11 所示。由于我们刚才写入数据的缓冲区(page)已经在内核空间中了,因此可以直接对其进行操作,并使用sprintf 来写入下一个 fortune。如果 next_fortune 索引大于 cookie_index (要写入的下一个位置),那么我们就将 next_fortune 返回为 0,这是第一个fortune 的索引。在将这个 fortune 写入用户缓冲区之后,在 next_fortune 索引上增加刚才写入的 fortune 的长度。这样就变成了下一个可用 fortune 的索引。这个 fortune 的长度会被返回并传递给用户。

清单 11. 对 fortune 进行读取操作所使用的函数

int fortune_read( char *page, char **start, off_t off,

int count, int *eof, void *data )

{

int len;

if (off > 0) {

*eof = 1;

return 0;

}

/* Wrap-around */

if (next_fortune >= cookie_index) next_fortune = 0;

len = sprintf(page, "%s\n", &cookie_pot[next_fortune]);

next_fortune += len;

return len;

}

从这个简单的例子中,我们可以看出通过 /proc 文件系统与内核进行通信实际上是件非常简单的事情。现在让我们来看一下这个 fortune 模块的用法(参见清单 12)。

清单 12. 展示 fortune cookie LKM 的用法

[root@plato]# insmod fortune.ko

[root@plato]# echo "Success is an individual proposition.

Thomas Watson" > /proc/fortune

[root@plato]# echo "If a man does his best, what else is there?

Gen. Patton" > /proc/fortune

[root@plato]# echo "Cats: All your base are belong to us.

Zero Wing" > /proc/fortune

[root@plato]# cat /proc/fortune

Success is an individual proposition. Thomas Watson

[root@plato]# cat /proc/fortune

If a man does his best, what else is there? General Patton

[root@plato]#

/proc 虚拟文件系统可以广泛地用来报告内核的信息,也可以用来进行动态配置。我们会发现它对于驱动程序和模块编程来说都是非常完整的。在下面的参考资料中,我们可以学习到更多相关知识。

linux proc文件系统学习

linux proc文件系统学习 目录: /proc --- 一个虚拟文件系统 加载 proc 文件系统 察看 /proc 的文件 得到有用的系统/内核信息 有关运行中的进程的信息 通过 /proc 与内核交互 结论 参考文献 摘要: Linux 内核提供了一种通过 /proc 文件系统,在运行时访问内核内部数据结构、改变内核设置的机制。尽管在各种硬件平台上的 Linux 系统的 /proc 文件系统的基本概念都是相同的,但本文只讨论基于 intel x86 架构的 Linux /proc 文件系统。 _________________ _________________ _________________ 一./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 文件系统才根据内核中的信息建立相应的文件和目录。 二.加载 proc 文件系统 如果系统中还没有加载 proc 文件系统,可以通过如下命令加载 proc 文件系统: mount -t proc proc /proc 上述命令将成功加载你的 proc 文件系统。更多细节请阅读 mount 命令的man page。 三.察看 /proc 的文件 /proc 的文件可以用于访问有关内核的状态、计算机的属性、正在运行的进

通过proc文件获取系统资源

通过读 proc 等方式获取 Linux 系统状态信息的一些方法(转)
2007-11-23 16:50
现在又要搞进程的 CPU,MEM 信息,继续查索 本文中所有样例,2.6.x kernel 的取自 rhel4, 2.4.x kernel 的取自 rh9. Copyright: icymoon@NKU 1.需要的系统状态信息
? ? ? ? ?
CPU Usage Memory/Swap Usage Disk Usage Disk I/O Ratio Process Information
2.相关文件及计算方法(1)CPU Usage 相关文件:/proc/stat 的第一行 文件样例&基本计算方法: a. 2.4.x kernel:
cpu 3156877 522645 1178059 169750391 cpu0 1111979 148713 315873 42075428 cpu1 444227 139960 119846 42947960 cpu2 1113218 155429 480187 41903159 cpu3 487453 78543 262153 42823844 page 1265588 10643253 swap 121 1258 intr 135336914 43651993 84 0 0 1 0 3 0 1 0 0 0 0 0 2 0 0 0 0 0 30 0 0 0 0 0 0 778176 42 60685630 30220952 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 disk_io: (8,0):(788586,178980,2529284,609606,21286496) (8,1):(3,3,24,0,0) ctxt 171689341 btime 1177119654 processes 3110142
在 kernel 2.4.x 下,第一行只有五个字段,后四个字段依次是自从系统 启动以来,系统运行在 user mode, nice, system mode 下和 idle 状态的时 间,以 1/100 秒为单位。(后面的 cpu0, cpu1…行是在有多处处理器的机器 上,每个处理器运行在不同模式下的值,含义相同。) 则设总 CPU 运行时间为 total,total = usr + nice + sys + idle 在一定时间间隔下两次读取文件,得到前后两次的处理器运行时间为 usr1, nice1,sys1,idle1 与 usr2, nice2, sys2, idle2. total1 = usr1 + nice1 + sys1 + idle1 total2 = usr2 + nice2 + sys2 + idle2 间隔时间为 itv = total2-total1,则有

Linux文件系统实验

实验编号与实验名称: 文件系统实验 实验目的: 熟悉文件和目录的基本操作;了解Linux的/proc文件系统 实验内容及要求(详见实验讲义与实验指导书): 内容: 1)在/usr目录下创建一个目录usr_test和文本文件test,并建立一个test文件的链接 test02。通过修改test文件中的内容查看test和test02中内容的情况,并分析原因。 2)编写程序,从/proc文件中抽取内核参数(任意的2个参数即可,如CPU时钟速度信 息等) 3)实现文件的拷贝,即把一个文件内容复制到另一个文件 要求: 对于内容1),给出操作步骤和结果分析,需回顾第二次实验中练习过的Shell命令和教材中的文件和目录操作系统调用 对于内容2)和3)给出完整C语言代码或者代码截图和代码执行结果,可参考本文件“实验预读”中相关内容和教材P.149/266图4-5相关代码 实验用到的软件(:) VMware 实验内容及关键步骤(代码)Q2(60分) 1)在/usr目录下创建一个目录usr_test和文本文件test,并建立一个test文件的链接 test02。通过修改test文件中的内容查看test和test02中内容的情况,并分析原因。

分析:在linux系统中通过link连接就可以通过第三方的查询,通过link函数后test01被绑定给test02中,所以可以通过test02去查询。 2.编写程序,从/proc文件中抽取内核参数(任意的2个参数即可,如CPU时钟速度信息等)

3.实现文件的拷贝,即把一个文件内容复制到另一个文件

实验过程中遇到的问题解决办法与实验体会Q3(10分)得分: 评阅教师特殊评语: 评阅教师: 日期:

SAS系统和数据分析PROC步中的通用语句

第十六课用在PROC步中的通用语句 当我们用DATA步创建好SAS数据集后,可以用SAS的一些PROC过程步来进一步的分析和处理它们。在DATA步中用户可以使用SAS的语句来编写自己的程序,以便能通过读入、处理和描述数据,创建符合自己特殊要求的SAS数据集。而后由一组组PROC步组成的程序进行后续分析和处理。 一、PROC程序的主要作用 ●读出已创建好的SAS数据集 ●用数据集中的数据计算统计量 ●将统计的结果按一定形式输出 在SAS系统中,计算统计量时,对于许多常用的和标准的统计计算方法,并不需要用户自己编写这些复杂的程序,而是通过过程的名字来调用一个已经为用户编写好的程序。用户通常只要编写调用统计过程前的准备处理程序和输出统计结果后的分析和管理程序。只有用户自己非常特殊的统计计算方法才需要用户自己编写相应的计算程序。 二、PROC过程语句 PROC语句用在PROC步的开始,并通过过程名来规定我们所要使用的SAS过程,对于更进一步的分析,用户还可以在PROC语句中使用一些任选项,或者附加其他语句及它们的任选项(如BY语句)来对PROC步规定用户所需要分析的更多细节。PROC语句的格式为: PROC 过程名<选项>; 过程名规定用户想使用的SAS过程的名字。例如,我们在前面常使用的打印过程名PRINT,对数值变量计算简单描述统计量的过程名MEANS。 选项规定这个过程的一个或几个选项。不同的过程规定的选项是不同的,因此,只有知道具体的过程才能确定具体的选项是什么。但是,在各个不同过程中使用选项时,下面三种选项的使用格式是共同的: ●Keyword ●Keyword=数值 ●Keyword=数据集 Keyword是关键字,第一种选项格式是某个具体过程进一步要求某个关键字;第二种选项格式是某个具体过程要求某个关键字的值,值可能是数值或字符串;第三种选项格式是某个具体过程要求输入或输出数据集。例如: PROC Print Data=class ; 过程Print,作用为打印输出数据集中的数据。选项为Data=class,关键字是Data,进一步说明要打印输出的数据集名为class。如果省略这个选项,将用最近产生的SAS数据集。

Linux文件系统制作详细

Linux文件系统制作流程 关键词:ARM Linux yaffs 文件系统移植 Linux 文件系统简介 Linux支持多种文件系统,包括ext2、ext3、vfat、ntfs、iso9660、jffs、romfs和nfs等,为了对各类文件系统进行统一管理,Linux引入了虚拟文件系统VFS(Virtual File System),为各类文件系统提供一个统一的操作界面和应用编程接口。 Linux下的文件系统结构如下: Linux启动时,第一个必须挂载的是根文件系统;若系统不能从指定设备上挂载根文件系统,则系统会出错而退出启动。之后可以自动或手动挂载其他的文件系统。因此,一个系统中可以同时存在不同的文件系统。 不同的文件系统类型有不同的特点,因而根据存储设备的硬件特性、系统需求等有不同的应用场合。在嵌入式Linux应用中,主要的存储设备为RAM(DRAM,

SDRAM)和ROM(常采用FLASH存储器),常用的基于存储设备的文件系统类型包括:jffs2, yaffs, cramfs, romfs, ramdisk, ramfs/tmpfs等。 >基于FLASH的文件系统 Flash(闪存)作为嵌入式系统的主要存储媒介,有其自身的特性。Flash的写入操作只能把对应位置的1修改为0,而不能把0修改为1(擦除Flash就是把对应存储块的内容恢复为1),因此,一般情况下,向Flash写入内容时,需要先擦除对应的存储区间,这种擦除是以块(block)为单位进行的。 闪存主要有NOR和NAND两种技术(简单比较见附录)。Flash存储器的擦写次数是有限的,NAND闪存还有特殊的硬件接口和读写时序。因此,必须针对Flash 的硬件特性设计符合应用要求的文件系统;传统的文件系统如ext2等,用作Flash的文件系统会有诸多弊端。 在嵌入式Linux下,MTD(Memory Technology Device,存储技术设备)为底层硬件(闪存)和上层(文件系统)之间提供一个统一的抽象接口,即Flash的文件系统都是基于MTD驱动层的(参见上面的Linux下的文件系统结构图)。使用MTD 驱动程序的主要优点在于,它是专门针对各种非易失性存储器(以闪存为主)而设计的,因而它对Flash有更好的支持、管理和基于扇区的擦除、读/写操作接口。 顺便一提,一块Flash芯片可以被划分为多个分区,各分区可以采用不同的文件系统;两块Flash芯片也可以合并为一个分区使用,采用一个文件系统。即文件系统是针对于存储器分区而言的,而非存储芯片。 1. jffs2 JFFS文件系统最早是由瑞典Axis Communications公司基于Linux2.0的内核为嵌入式系统开发的文件系统。JFFS2是RedHat公司基于JFFS开发的闪存文件系统,最初是针对RedHat公司的嵌入式产品eCos开发的嵌入式文件系统,所以JFFS2也可以用在Linux, uCLinux中。 Jffs2: 日志闪存文件系统版本2 (Journalling Flash FileSystem v2) 主要用于NOR型闪存,基于MTD驱动层,特点是:可读写的、支持数据压缩的、基于哈希表的日志型文件系统,并提供了崩溃/掉电安全保护,提供“写平衡”支持等。缺点主要是当文件系统已满或接近满时,因为垃圾收集的关系而使jffs2的运行速度大大放慢。 目前jffs3正在开发中。关于jffs系列文件系统的使用详细文档,可参考MTD补丁包中mtd-jffs-HOWTO.txt。 jffsx不适合用于NAND闪存主要是因为NAND闪存的容量一般较大,这样导致jffs为维护日志节点所占用的内存空间迅速增大,另外,jffsx文件系统在

根文件系统

根文件系统 物联网学院平震宇

根文件系统 根文件系统就是一种目录结构,根文件系统包括Linux启动时所必需的目录和关键性的文件。例如Linux启动时都需要有init日录下的相关文件,在Linux挂载分区时Linux一定会找/etc/fstab这个挂载文件系统等,根文件系统中还包括了许多的应用程序bin目录等。

基本根文件系统目录构成解析 目录名称含义/bin 存放二进制程序,如:ls,cp /boot 存放系统启动的一些程序 /dev 存放设备文件 /etc 存放系统配置文件,如:group,profile /home 用户根目录 /lib 存放库文件 /media 媒介的挂载点,如:闪存 /mnt 该目录用来为其他文件系统提供安装点 /opt 不随发行版本一起交付的程序 /proc proc文件系统 /root 超级用户根目录 /sbin 存放超级用户运行的二进制文件 /src 存放一些服务的目录 /sys sys文件系统的目录 /var 存放经常变化的文件,如临时文件等

根文件系统引导过程 BusyBox的init进程会依次进行以下工作 ?为init设置信号处理进程。 ?初始化控制台。 ?剖析inittab文件、/etc/inittab文件。 ?执行系统初始化的命令行。 ?BusyBox在缺省情况下会使用/etc/init.d/rcS命令行。 ?执行所有会导致init暂停的inittab命令。 ?执行所有仅执行一次的inittab命令。 ?一旦完成以上工作,init进程便会循环执行以下工作: ?执行所有终止时必须重新启动的inittab命令。 ?执行所有终止时必须重新启动但启动前必须先询问过用户的?inittab命令

linux系统下查看系统信息命令

Linux的文件系统中,有一个特殊目录“/proc”,该目录下列出的文件并非保存在磁盘上,而是内存中的一个映像。在该目录下可以找到许多有意思的东西,例如: /proc/cpuinfo 本机CPU的相关信息; /proc/meminfo 本机内存及交换分区的使用信息; /proc/modules 本机已安装的硬件模块信息; /proc/mounts 本机已挂载mount 上的设备信息; 此外,该目录下有一些以数字为名称的子目录,每个子目录用于维护一个正在运行的进程,而目录名即为相应的进程ID。例如进入名称为“1” 的子目录:cd /proc/1 该目录下文件“cmdline” 中的内容为该进程运行时执行的命令行;“environ”文件中的内容为该进程运行时的环境变量信息;“stat” 文件中存放的时该进程运行的状态信息等。 通过查看“ /proc” 目录下的文件,可以获取几乎所有的系统信息及系统的运行状态信息。事实上,Linux下的诸多查询系统状态信息的命令,也是通过读取该目录下的文件而获取的。 以下是一些用于查看系统状态信息的命令: df 命令 用于查看Linux 文件系统的状态信息,显示各个分区的容量、已使用量、未使用量及挂载点等信息。如: df -k 以千字节(KB)为单位显示各分区的信息; df -a 显示所有分区,包括大小为0 的分区; df -T 显示分区类型(EXT2 或EXT3等)。 du 命令 用于查看文件或文件夹的大小。如: du -b /home 以字节为单位显示“ /home ”文件夹下各个子文件夹的大小; du -ks home 以千字节(KB)为单位显示“/home” 文件夹的总大小; top 命令(第三页有详细的图形介绍top命令) 用于实时查看系统状态信息。运行该命令后,屏幕上会显示如下信息: CPU状态(CPU states):包括用户进程占用比率、系统进程占用比率、用户的nice 优先级进程占用比率及空闲CPU资源比率等;

Linux文件系统下proc目录详解

Linux中/proc目录下文件详解(2008-7-20 15:54)Linux中/proc目录下文件详解(一) -------------------------------------------------------------------------------- /proc文件系统下的多种文件提供的系统信息不是针对某个特定进程的,而是能够在整个系统范围的上下文中使用。可以使用的文件随系统配置的变化而变化。命令procinfo能够显示基于其中某些文件的多种系统信息。以下详细描述/proc下的文件。 -------------------------------------------------------------------------------- /proc/cmdline文件 这个文件给出了内核启动的命令行。它和用于进程的cmdline项非常相似。 示例: [root@localhost proc]# cat cmdline ro root=LABEL=/ rhgb quiet -------------------------------------------------------------------------------- /proc/cpuinfo文件 这个文件提供了有关系统CPU的多种信息。这些信息是从内核里对CPU的测试代码中得到的。文件列出了CPU的普通型号(386,486,586,686等),以及能得到的更多特定信息(制造商,型号和版本)。文件还包含了以bogomips表示的处理器速度,而且如果检测到CPU的多种特性或者bug,文件还会包含相应的标志。这个文件的格式为:文件由多行构成,每行包括一个域名称,一个冒号和一个值。 示例: [root@localhost proc]# cat cpuinfo processor : 0 vendor_id : AuthenticAMD cpu family : 6 model : 8 model name : AMD Athlon(tm) XP 1800+ stepping : 1 cpu MHz : 1530.165 cache size : 256 KB fdiv_bug : no hlt_bug : no f00f_bug : no coma_bug : no fpu : yes fpu_exception : yes cpuid level : 1 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat pse36 mmx fxsr sse syscall mmxext 3dnowext 3dnow

实验指导书--实验11 Linux proc文件系统

实验十一:Linux proc文件系统 实验学时:4 实验类型:验证 实验要求:选修 一、实验目的 通过本实验的学习,理解和分析proc文件系统,掌握Linux proc文件的特点和使用方法,访问有关内核的状态、计算机的属性、正在运行的进程状态等信息。 二、实验内容 实验内容:了解proc文件系统,编写一个c程序,获取系统相关信息,实时监测(周期性显示)CPU、主存和网络的详细使用情况以及它们的利用率。 三、实验原理、方法和手段 实验原理: proc 文件系统介绍: proc 文件系统是一个虚拟文件系统,是一种内核和内核模块用来向进程(process) 发送信息的机制 (所以叫做proc)。这个虚拟文件系统让你可以和内核内部数据结构进行交互,获取有关进程的有用信息,在运行中 (on the fly) 改变设置 (通过改变内核参数)。与其他文件系统不同,proc 存在于内存之中而不是硬盘上。 proc文件系统包含一些目录和虚拟文件。大部分proc中的文件和目录提供系统物理环境最新的信息。 /proc目录中有一些以数字命名的目录,它们是进程目录。系统中当前运行的每一个进程在/proc下都对应一个以进程号为目录名的目录/proc/pid,它们是读取进程信息的接口。此外,在Linux2.6.0-test6以上的版本中/proc/pid 目录中有一个task目录,/proc/pid/task目录中也有一些以该进程所拥有的线程的线程号命名的目录/proc/pid/task/tid,它们是读取线程信息的接口。 /proc 由内核控制,没有承载 /proc 的设备。因为 /proc 主要存放由内核控制的状态信息,所以大部分这些信息的逻辑位置位于内核控制的内存。对/proc 进行一次 'ls -l' 可以看到大部分文件都是 0 字节大的;不过察看这些文件的时候,确实可以看到一些信息。这是因为 /proc 文件系统和其他常规的文件系统一样把自己注册到虚拟文件系统层 (VFS) 了。然而,直到当 VFS 调用它,请求文件、目录的 i-node 的时候,/proc 文件系统才根据内核中的信息建立相应的文件和目录。

linux proc分析(DOC)

linux proc详解 proc文件系统总览: 在unix like操作系统中,几乎所有的数据实体都被抽象成文件。 可以认为procfs文件系统的作用是将内核信息抽象成文件接口,内核信息和可设置参数都以文件的形式存在,并组成1个目录树。使得用户可通过文件系统接口(echo,cat等命令,只要权限允许)来获取和调整内核状态。 同时procfs文件系统也为用户提供了1个接口,使得用户的内核模块或用户态程序可通过procfs传递参数。 linux中的一些系统工具需要通过procfs获取内核参数,比如ps、lspci等命令。 可通过以下命令加载1个procfs文件系统(首先需要确认目标系统支持procfs): # mount –t proc none /proc 也可在/etc/fstab文件中加入以下命令,使得系统在启动时自动加载procfs: none /proc proc defaults 0 0 在proc文件系统中,主要包含3部分内容,进程相关部分、系统信息部分以及各子系统相关部分。以下为1个典型的procfs文件系统目录示例: > ls /proc 1 2 2166 2281 cmdline interrupts meminfo stat

13 2001 2167 3 cpuinfo iomem misc swaps 1646 2042 2168 4 crypto ioports modules sys 1780 2058 2169 5 devices irq mounts sysrq-trigger 1834 2087 2170 6 dma isapnp mtrr sysvipc 1838 2096 2171 7 driver kcore net tty 1857 2107 2207 71 execdomains kmsg partitions uptime 1877 2117 2208 8 fb ksyms pci version 1889 2143 2216 9 filesystems loadavg scsi 1905 2153 2217 apm fs locks self 1960 2165 2219 bus ide mdstat slabinfo 从以上输出中可看到procfs所包含的内容: 1.进程相关部分(只读): 在procfs中存在一些以数字(pid)命名的目录,该数字即为对应进程的pid。 /proc/self目录是1个指向当前进程的符号链接。当用户执行cat self/cmdline命令时,会为执行cat 命令而创建1个进程,并输出当前进程的命令行参数,也就是catself/cmdline(会省略空格)。 2.内核信息部分(只读): 这部分文件一般位于/proc目录下,可通过cat命令进行查看。 会在/proc/cmdline文件中保存内核引导时的命令行参数:

Linux下proc文件系统编程

/proc文件系统编程 在Linux中有一个另外的机制来使内核及内核模块发送信息给进程——/proc文件系统。./proc文件系统 在Linux中有一个另外的机制来使内核及内核模块发送信息给进程——/proc文件系统。 /proc文件系统最初是设计使得容易得到进程的信息(从名字可以看出),现在却被任意一块有内容需要报告的内核使用,比如拥有模块列表的/proc/modules和拥有内存使用统计信息的 /proc/meminfo。 使用proc文件系统的方法很象使用设备驱动——你创建一个数据结构,使之包含/proc 文件需要的全部信息,包括所有函数的句柄(在我们的例子里只有一个,在试图读取/proc 文件时调用)。然后,用init_module注册这个结构,用cleanup_module注销。 我们使用proc_register_dynamic(注3.1)的原因是我们不希望决定以后在文件中使用的 索引节点数,而是让内核来决定它,为了防止冲突。标准的文件系统是在磁盘上而不是在内存(/proc的位置在内存),在这种情况下节点数是一个指向文件的索引节点所在磁盘地址的指针。这个索引节点包含了文件的有关信息比如文件的访问权限以及指向磁盘地址的指真或者文件数据的位置。 因为在文件打开或关闭时我们没有调用,所以在模块里无处可放宏 MOD_INC_USE_COUNT和MOD_DEC_USE_COUNT,而且如果文件被打开了或者模块被 删除了,就没有办法来避免这个结果。下一章我们将会看到一个更困难的处理/proc的方法,但是也更加灵活,也能够解决这个问题。 ex procfs.c /* procfs.c - create a "file" in /proc * Copyright (C) 1998-1999 by Ori Pomerantz */ /* The necessary header files */ /* Standard in kernel modules */ #include /* We're doing kernel work */ #include /* Specifically, a module */ /* Deal with CONFIG_MODVERSIONS */ #if CONFIG_MODVERSIONS==1 #define MODVERSIONS #include #endif /* Necessary because we use the proc fs */ #include

Linux驱动开发笔记8Proc文件操作

Linux驱动开发笔记8 proc文件操作 一、proc文件系统简介 linux系统对/proc的使用很频繁,现代Linux发行版中的很多工具都是通过/proc来获取它们所需要的信息,例如:ps、top等,有些设备驱动程序也通过/proc导出信息。我们自己的驱动程序当然也可以这么做。因为/proc文件系统是动态的,所以驱动程序模块可以在任何时候添加或删除其中的入口项。这些/proc文件不仅可以用于读出数据,也可以用于写入数据。不过,大多数时候,/proc入口项是只读文件。proc文件系统是一个虚拟的文件系统,内核使用它来输出一些信息,每一个在/proc下的文件都绑定一个内核函数,操作这个文件就是在调用这个函数,该文件系统下的文件是动态生成的,当某个进程读取proc文件时,内核会分配一个页大小的内存,驱动程序可以向这个内存中写入要返回用户态的数据。 一、proc文件系统操作 1.读取只读文件接口 当读取proc文件时会调用这个函数 int(*read_proc)(char *page, char **start, off_t off, int count, int*eof, void *data); page内核分配的那段内存空间的指针 start用来记录要返回用户态的数据写到了内存页的哪个位置,比如第一次读了五个,就可以把*start设置为5,下次读得时候就从5这个偏移量开始读off start==NULL的时候这个值就无效了

count用户态要读取的字节数 eof当内核态没有要返回用户态的数据时要设置这个值 data内核态在创建proc文件时保存的一个数据,在调用读取函数时传到这里这个函数必须返回放到缓存当中的字节数 2.创建只读proc文件接口 staticinline struct proc_dir_entry *create_proc_read_entry(constchar *name, mode_t mode, struct proc_dir_entry *base, read_proc_t*read_proc, void * data) name要创建的proc文件的名字 mode文件的权限 base该文件的父目录,如果为NULL则默认创建到/proc下 read_proc这个是传入实现读取这个文件的函数 data这个data的值就是当调用读取函数时候传入读取函数的data的值这个函数如果返回NULL代表创建失败 3.删除proc文件接口 void remove_proc_entry(const char *name, struct proc_dir_entry *parent) name要删除的文件的名字 parent该文件所在的父目录 4.创建读写proc文件接口 staticinline struct proc_dir_entry *create_proc_entry(constchar *name, mode_t mode, struct proc_dir_entry *parent) name要创建的文件的名字 mode文件的权限 parent要创建的文件的父目录,如果为NULL则代表在/proc下创建 在该函数的返回值中初始化这个文件的读和写函数 例如:file->read_proc= my_read file->write_proc= my_write 5.读取proc文件接口 当读取proc文件时会调用这个函数 int(*read_proc)(char *page, char **start, off_t off, int count, int*eof, void *data);

操作系统实验11 Linux proc文件系统

《操作系统》实验报告 实验序号:实验十一实验项目名称:Linux proc文件系统 学号1207022103 姓名陈华荣专业、班1班 实验地点实1-311 指导教师李桂森实验时间2014-12-17 一、实验目的 通过本实验的学习,使学生掌握Linux 系统Web服务器的配置方法,搭建简单的动态数据网站。 二、实验内容 实验内容:实践Linux系统Web服务器的配置操作,并搭建简单的动态网站。三、实验内容与步骤 1,查看/proc 目录,了解此目录下各个目录以及文件的含义;解释以下文件的含义: proc 文件系统可以被用于收集有用的关于系统和运行中的内核的信息。下面是一些重要的文件: * /proc/cpuinfo - CPU 的信息 (型号, 家族, 缓存大小等) * /proc/meminfo - 物理内存、交换空间等的信息 * /proc/mounts - 已加载的文件系统的列表

* /proc/devices - 可用设备的列表 * /proc/filesystems - 被支持的文件系统

* /proc/modules - 已加载的模块 * /proc/version - 内核版本

* /proc/cmdline - 系统启动时输入的内核命令行参数 * /proc/XXX – XXX是指以数字编号的目录,有不少这样的目录,每一个目录表示 一个进程(即线程组) * /proc/sys –可以修改的系统信息 * /proc/swaps - 要获知swap空间的使用情况 * /proc/uptime - 获取系统的正常运行时间 * /proc/fs/nfsd/exports - 列出由NFS共享的文件系统

proc文件系统及其相关操作

Struct proc_dir_entry *proc_mkdir(const char *name, struct proc_dir_entry *parent) 说明: Name:要创建的目录名 Parent:父目录指针 返回值:proc_dir_entry类型指针,以后会传递这个指针到create_proc_read_entry() 里在name目录下创建文件。 用法: Struct proc_dir_entry *parent; Parent=proc_mkdir(“myproc”,NULL); Create_proc_read_entry(“scullmem”,0744,parent,scull_read_procmem,NULL); 函数create_proc_entry,由它创建并注册proc文件 struct proc_dir_entry *create_proc_entry(const char *name, mode_t mode, struct proc_dir_entry *parent) 这样,在/proc下创建了myproc目录,并在myproc目录下创建了一个名为scullmem的文件,权限为0744 proc_dir_entry结构体的详解: 相对于其他逻辑文件系统的具体文件组织形式(比如ext2文件系统的inode),proc文件系统也有自己的组织结构,那就是proc_dir_entry结构,所属于proc文件系统的文件,都对应一个proc_dir_entry结构,并且VFS需要读取proc文件的时候,把这个结构和VFS的inode建立链接(即由inode u.generic_ip指向该proc_dir_entry结构),因此,proc文件系统实现了一套对proc_dir_entry结构的管理。 1.proc_dir_entry结构,这个结构体描述了一个proc文件的全部信息,每一个proc 文件都是由这个结构体来表示的 struct proc_dir_entry{ unsigned short low_ino; //这是用来唯一标志proc_dir_entry结构的节点号,也就是proc文件系统内的索引节点的标号,除了根节点,其他的节点号都是在创建proc_dir_entry的时候,由make_inode_number()动态创建的unsigned short namelen; const char *name; //这个proc文件的名字 mode_t mode; //文件的模式,由两部分用位或运算组成,第一部分是文件的类型如S_IFREG表示普通文件,S_IFDIR表示目录文件,第二部分是文件的权限如S_IRUSR表示该文件能够被拥有者读,S_IROTH表示可以被其他人读取nlink_t nlink;

SAS系统和数据分析使用列表报告和汇总报告

第十七课使用列表报告PROC PRINT和汇总报告PROC TABULATE 利用SAS系统提供的各种过程可以制作各种风格的报表。一份好的输出报表可以使用户更直观、更清楚和更容易地了解和明白统计计算的结果,因此如何制作一个能充分揭示运算结果信息和满足要求的报告,也是非常重要的。SAS系统提供的各种制作报表的过程中,最常用的是以下两种: ●列表报告PROC PRINT过程 ●汇总报告PROC TABULATE过程 一、列表报告PROC PRINT过程 所谓列表报告PROC PRINT过程,将输出SAS数据集中的数值,输出时把数据集中的每一个变量形成输出报表的列,而每一个观测形成输出报表的一行。 1.PROC PRINT过程的主要功能 PROC PRINT过程输出的数据列表具体地说主要能够做到以下几点: ●变量的输出格式用户可以选择(Format语句) ●可在输出报表中加上标题(Title)和脚注(Footnotes语句) ●可输出数据集中变量的任何子集(Where语句) ●可以控制变量是否出现以及出现的顺序(V ar语句) ●用户可以自己订制列表头(Label语句) ●可分组输出观测数据(By语句) ●可计算所有观测值或分组观测值的总和(Sum/Sumby语句)及其他统计量 ●每页报表的宽度和长度以及每列的宽度都可控制(选项Width=) ●当数据集中变量太多时,可分成几部分输出(选项Rows=) 2.PROC PRINT过程语句格式 在PROC PRINT过程中,常常配合使用了许多其他SAS语句以达到所要求的输出报表格式,我们把在PROC PRINT过程中常用的一些语句的基本使用格式列出,具体使用时根据需要可能使用其中的几条语句。如下所示: PROC PRINT<选项列表> ; V AR变量列表; ID变量列表; BY变量列表; PAGEBY变量;

proc文件系统

proc文件系统 proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。用户和应用程序可以通过proc得到系统的信息,并可以改变内核的某些参数。由于系统的信息,如进程,是动态改变的,所以用户或应用程序读取proc文件时,proc文件系统是动态从系统内核读出所需信息并提交的。它的目录结构如下: 目录名称目录内容 apm 高级电源管理信息 cmdline 内核命令行 Cpuinfo 关于Cpu信息 Devices 可以用到的设备(块设备/字符设备) Dma 使用的DMA通道 Filesystems 支持的文件系统 Interrupts 中断的使用 Ioports I/O端口的使用 Kcore 内核核心印象 Kmsg 内核消息 Ksyms 内核符号表 Loadavg 负载均衡 Locks 内核锁 Meminfo 内存信息 Misc 杂项 Modules 加载模块列表 Mounts 加载的文件系统 Partitions 系统识别的分区表 Rtc 实时时钟 Slabinfo Slab池信息 Stat 全面统计状态表 Swaps 对换空间的利用情况 Version 内核版本 Uptime 系统正常运行时间 并不是所有这些目录在你的系统中都有,这取决于你的内核配置和装载的模块。另外,在/proc 下还有三个很重要的目录:net,scsi和sys。Sys目录是可写的,可以通过它来访问或修改内核的参数(见下一部分),而net和scsi则依赖于内核配置。例如,如果系统不支持scsi,则scsi目录不存在。 除了以上介绍的这些,还有的是一些以数字命名的目录,它们是进程目录。系统中当前运行的每一个进程都有对应的一个目录在/proc下,以进程的PID号为目录名,它们是读取进程信息的接口。而self目录则是读取进程本身的信息接口,是一个link。Proc文件系统的名字就是由之而起。进程目录的结构如下:

使用proc 文件系统来访问 Linux 内核的内容

使用/proc 文件系统来访问Linux 内核的内容 这个虚拟文件系统在内核空间和用户空间之间打开了一个通信窗口 M. Tim Jones (mtj@https://www.wendangku.net/doc/6513232558.html,), 资深首席软件工程师, Emulex 简介: /proc 文件系统是一个虚拟文件系统,通过它可以使用一种新的方法在Linux? 内核空间和用户空间之间进行通信。在/proc 文件系统中,我们可以将对虚拟文件的读写作为与内核中实体进行通信的一种手段,但是与普通文件不同的是,这些虚拟文件的内容都是动态创建的。本文对/proc 虚拟文件系统进行了介绍,并展示了它的用法。 发布日期: 2006 年 4 月24 日 级别:初级 访问情况: 43874 次浏览 评论: 2 (查看 | 添加评论 - 登录) 平均分(108个评分) 为本文评分 最初开发/proc 文件系统是为了提供有关系统中进程的信息。但是由于这个文件系统非常有用,因此内核中的很多元素也开始使用它来报告信息,或启用动态运行时配置。 /proc 文件系统包含了一些目录(用作组织信息的方式)和虚拟文件。虚拟文件可以向用户呈现内核中的一些信息,也可以用作一种从用户空间向内核发送信息的手段。实际上我们并不会同时需要实现这两点,但是本文将向您展示如何配置这个文件系统进行输入和输出。尽管像本文这样短小的一篇文章无法详细介绍/proc 的所有用法,但是它依然对这两种用法进行了展示,从而可以让我们体会一下/proc 是多么强大。清单1 是对/proc 中部分元素进行一次交互查询的结果。它显示的是/proc 文件系统的根目录中的内容。注意,在左边是一系列数字编号的文件。每个实际上都是一个目录,表示系统中的一个进程。由于在GNU/Linux 中创建的第一个进程是init进程,因此它的process-id为1。然后对这个目录执行一个ls命令,这会显示很多文件。每个文件都提供了有关这个特殊进程的详细信息。例如,要查看init的command-line 项的内容,只需对cmdline文件执 行cat命令。 /proc 中另外一些有趣的文件有:cpuinfo,它标识了处理器的类型和速度;pci,显示在PCI 总线上找到的设备;modules,标识了当前加载到内核中的模块。 清单 1. 对/proc 的交互过程 [root@plato]# ls /proc 1 2040 2347 2874 474 fb mdstat sys 104 2061 2356 2930 9 filesystems meminfo sysrq-trigger 113 2073 2375 2933 acpi fs misc sysvipc 1375 21 2409 2934 buddyinfo ide modules tty 1395 2189 2445 2935 bus interrupts mounts uptime 1706 2201 2514 2938 cmdline iomem mtrr version

相关文档