不累的王
普通会员
发贴: 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,则说明文件结束了。
<---- 以上言论仅代表本人立场 ---->
__________________
“……机器人罗诺,现在我要对你下达最新指令了。”
“是,主人。我都等了三万年了呢。”
“你还记得回地球的航路吧?” |
|