找回密码
 注册创意安天

[精华] /proc文件系统

[复制链接]
发表于 2009-7-23 17:27 | 显示全部楼层 |阅读模式
不累的王

普通会员

发贴: 339
积分: 0
来自:
注册日期: 2006-05-26
  发表时间: 2006-10-19 23:08:37  

--------------------------------------------------------------------------------
今天我们都被一个"能读出内容却不能取得长度"的文件晃点了,
后来俺发现了那个文件路径前面赫然是 /proc...
发这个帖子以示纪念...

/proc文件系统

/proc 文件系统是一个假的文件系统。 它不存在在磁盘某个磁盘上。而是由核心在内存中产生。用于提供关于系统的信息(originally about processes, hence the name)。 下面说明一些最重要的文件和目录。 /proc 文件系统在proc man页中有更详细的说明。

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

/proc/1
关于进程1的信息目录。每个进程在/proc 下有一个名为其进程号的目录。
/proc/cpuinfo
处理器信息,如类型、制造商、型号和性能。
/proc/devices
当前运行的核心配置的设备驱动的列表。
/proc/dma
显示当前使用的DMA通道。
/proc/filesystems
核心配置的文件系统。
/proc/interrupts
显示使用的中断,and how many of each there have been.
/proc/ioports
当前使用的I/O端口。
/proc/kcore
系统物理内存映象。与物理内存大小完全一样,但不实际占用这么多内存;it is generated on the fly as programs access it. (记住:除非你把它拷贝到什么地方,/proc 下没有任何东西占用任何磁盘空间。)
/proc/kmsg
核心输出的消息。也被送到syslog 。
/proc/ksyms
核心符号表。
/proc/loadavg
系统"平均负载";3个没有意义的指示器指出系统当前的工作量。
/proc/meminfo
存储器使用信息,包括物理内存和swap。
/proc/modules
当前加载了哪些核心模块。
/proc/net
网络协议状态信息。
/proc/self
到查看/proc 的程序的进程目录的符号连接。 当2个进程查看/proc 时,是不同的连接。 这主要便于程序得到它自己的进程目录。
/proc/stat
系统的不同状态,such as the number of page faults since the system was booted.
/proc/uptime
系统启动的时间长度。
/proc/version
核心版本。

注意所有上述文件给出易读的文本文件,有时可能是不易读的格式。有许多命令做了些格式化以更容易读。 例如,free 程序读/proc/meminfo 并将给出的字节数转换为千字节(并增加了一些信息)。



此贴由不累的王在 2006-10-19 16:24 编辑过。
<---- 以上言论仅代表本人立场 ---->



__________________


  “……机器人罗诺,现在我要对你下达最新指令了。”
  “是,主人。我都等了三万年了呢。”
  “你还记得回地球的航路吧?”



   

不累的王

普通会员

发贴: 339
积分: 0
来自:
注册日期: 2006-05-26
  发表时间: 2006-10-19 23:22:44  

--------------------------------------------------------------------------------
再推荐一篇LinuxFocus的文章~

理解 Proc 文件系统
http://www.linuxfocus.org/ChineseGB/January2004/article324.shtml


ps1inuxFocus最近怎么不更新了?
ps2:最初了解/proc也是通过这篇文章...

<---- 以上言论仅代表本人立场 ---->



__________________


  “……机器人罗诺,现在我要对你下达最新指令了。”
  “是,主人。我都等了三万年了呢。”
  “你还记得回地球的航路吧?”



   

andy

普通会员

发贴: 104
积分: 0
来自:
注册日期: 2006-05-17
  发表时间: 2006-10-19 23:29:14  

--------------------------------------------------------------------------------
应该说一下解决方法,比如将PROC的文件复制出来在读,或其它的方法
<---- 以上言论仅代表本人立场 ---->


   

不累的王

普通会员

发贴: 339
积分: 0
来自:
注册日期: 2006-05-26
  发表时间: 2006-10-19 23:33:51  

--------------------------------------------------------------------------------
按一般的方法读就行了 -_____-!
比如,我是一个字节一个字节读的,用 feof() 来查看是否到了文件尾部
反正 /proc 下的文件都不大...

只要不试图获取文件长度就行了
seek() 和 lseek() 也不会有作用。
<---- 以上言论仅代表本人立场 ---->



__________________


  “……机器人罗诺,现在我要对你下达最新指令了。”
  “是,主人。我都等了三万年了呢。”
  “你还记得回地球的航路吧?”



   

swordlea

版主

发贴: 652
积分: 0
来自: 论坛神游夜
注册日期: 2006-05-16
  发表时间: 2006-10-19 23:42:55  

--------------------------------------------------------------------------------
看到有人给了这样的一个例子,充分利用了fread的特性。


  #include   <stdio.h>     
  #include   <string.h>     
   
  int   main()     
  {     
  FILE   *sda,*f;     
  sda=NULL;     
  f=NULL;     
   
  //你可以读写任意数目的byte,一般是512,一个引导扇     
  long   total=1024*64;     
  long   pointer=0;     
   
  //初始化缓冲区     
  char   buff[256];     
  memset(buff,0,256);     
   
  if(NULL==(sda=fopen("/dev/   hda","rb")))     
  {     
  printf("cant   open   the   sda   file\n");     
  return   1;     
  }     
   
  if(NULL==(f=fopen("/home/mysda.dat","wb")))     
  {     
  printf("can't   open   the   mysda.dat   file\n");     
  fclose(f);     
  return   1;     
  }     
   
  printf("now,both   file   were   opened\n");     
  printf("the   FILE   pointer   is   %d   and   %d\n",sda,f);     
   
  while(pointer<=total)     
  {     
  if(256!=fread(buff,1,256,sda))     
  {     
  printf("read   error...%d..now   leaving\n",pointer);     
  exit(1);     
  }     
  if(256!=fwrite(buff,1,256,f))     
  {     
  printf("write   error   ..%d..now   leaving\n",pointer);     
  exit(1);     
  }     
  pointer+=256;     
  }     
   
   
  return   0;     
  }


<---- 以上言论仅代表本人立场 ---->



__________________
- Is life always this hard,or it just when you're a kid?
- Always like this.  
   

不累的王

普通会员

发贴: 339
积分: 0
来自:
注册日期: 2006-05-26
  发表时间: 2006-10-20 00:02:11  

--------------------------------------------------------------------------------
原来利用了返回值...

fread and fwrite return the number of items successfully read or writ-
ten (i.e., not the number of characters). If an error occurs, or the
end-of-file is reached, the return value is a short item count (or
zero).

那么正常方式去读就行了,若读出的长度小于期望值且读入的最后一字节为 EOF,则说明文件结束了。
<---- 以上言论仅代表本人立场 ---->



__________________


  “……机器人罗诺,现在我要对你下达最新指令了。”
  “是,主人。我都等了三万年了呢。”
  “你还记得回地球的航路吧?”
您需要登录后才可以回帖 登录 | 注册创意安天

本版积分规则

Archiver|手机版|小黑屋|创意安天 ( 京ICP备09068574,ICP证100468号。 )

GMT+8, 2024-11-18 09:26

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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