- 论坛徽章:
- 0
|
书接上回,上次我们说到了UNIX文件系统的结构,知道了有哪几个block,各是干什么用的,这回我们说说怎样对文件进行操作。
我们一般对文件进行操作时不是直接指定i-node号的,而是指定文件的路径的。然而,在内核对文件的操作却是通过i-node来进行的。那么问题就来了,系统又是如何将路径和i-node联系起来从而又找到硬盘上数据存放的具体位置的呢。
我来做一下解释,比如你要访问/home/user1/test.c这个文件。系统从根目录开始查找,根目录的i-node号是2这个是确定的。系统就去i-node block里找2号i-node,看过上次贴的朋友应该知道,它会告诉系统根目录信息数据存放在硬盘上的具体位置,里面会有根目录下的文件与i-node的对应表,就像我们上次那个程序里看到的那样。系统从而得到了home目录的i-node号然,然后再去硬盘看home目录下的文件与i-node的对应关系,这样也就找到了test.c在硬盘上的具体位置。
其实如果test.c这个文件很大那它在硬盘上也不是放在一起的。data block里其实是一个一个的小数据块,数据就放在这里。但这个块的大小是一定的有1024字节的也有2048,4096的这根据你的分区方法不同也不太一样。如果你的文件比较大那么一个数据块里就放不下它,这就需要更多的块。打个比方,你有130万RMB(好比一个文件),这么多钱可别被贼偷了去,要把它们放到保险柜(好比数据块)里,但保险柜太小一个只能放50万。那你需要几个保险柜呢。(好像是小学时候做的应用题)答案是3个,最后一个装了只装了30万。浪费了20万的空间。那我接着要问这时我正好有20万(好比另一个文件)也要放进保险柜,那我们一共要多少个保险柜呢。如果你说还是3个那你就错了。虽然你有一个保险箱浪费了20万的空间,但其他人的钱(其他文件)也是不能放进去的,否则谁也分不清里面哪些钱是你的哪些钱是我的了。所以我的20万也好即使是一块钱也需要一个新的保险柜。
下面我们举个例子来看看如何用i-node里面的信息。这个程序是将我们指定的两个文件名中输出更新时间晚的一个
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <stdio.h>
- int main( int argc , char *argv )
- {
- struct stat buf[2] , *p ;
- if( argc!=3 )
- {
- fprintf( stderr , "Usage : %s file1 file2\n" , argv[0] );
- exit(1);
- }
- p=buf;
- if( stat(argv[1],p)!=0 )
- {
- fprintf( stderr , "%s not found !\n" , argv[1] );
- exit(1);
- }
- p++;
- if( stat(argv[2],p)!=0 )
- {
- fprintf( stderr , "%s not found !\n" , argv[2] );
- exit(1);
- }
- if( buf[0].st_mtime > buf[1].st_mtime ) //比较更新时间
- printf( "%s\n" , argv[1] );
- else
- printf( "%s\n" , argv[2] );
- return 0;
- }
复制代码
大家可以自己执行一下看看结果。
我们来说说stat(),使用它可以得到一个叫stat的结构体,它包含了i-node里面的一部分信息。诸如,文件的权限,i-node号,链接数,所有者id,组id,文件大小等等。具体的大家可man stat查看一下。
- 作用:得到一个stat结构体。
- #include <sys/types.h>
- #include <sys/stat.h>
- int stat( char *path , struct stat *buf );
- 返回值: 成功时:0 失败时:-1
复制代码
为了简洁,我们的程序里没有考虑到更新时间相同的文件。大家可以自己补上。
下面我们做一个改变文件权限的程序。
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <stdio.h>
- #define MASK 0555 //设置掩码
- int main( int argc , char *argv[] )
- {
- struct stat buf[1];
- mode_t mode;
- if( argc!=2 )
- {
- fprintf( stderr , "Usage : %s file\n" , argv[0] );
- exit(1);
- }
- if( stat(argv[1],buf)!=0 )
- {
- fprintf( stderr , "Cannot read i-node\n" );
- exit(1);
- }
- mode = ( buf[0].st_mode & MASK );
- if ( chmod(argv[1],mode)!=0 ) //改变文件的权限
- {
- fprintf( stderr , "Cannot change mode\n" );
- }
- return 0;
- }
复制代码
怎么样这个程序不能我直接说里面的系统调用
chomd()
- 作用:改变文件的权限(关于权限下面要说)
- #include <sys/types.h>
- #include <sys/stat.h>
- int chmod( char *path , mode_t mode );
- 返回值: 成功时:0 失败时:-1
复制代码
那什么是文件的权限呢?你可以用
命令来查看根目录下所有子目录的权限。你会看见类似下面这样的
- drwxr-xr-x 2 root root 4096 11-04 22:43 bin
- drwxr-xr-x 4 root root 1024 09-27 02:15 boot
- drwxr-xr-x 10 root root 3640 11-11 15:08 dev
- drwxr-xr-x 88 root root 12288 11-11 15:08 etc
- drwxr-xr-x 3 root root 4096 09-27 02:40 home
- drwxr-xr-x 11 root root 4096 10-31 21:49 lib
- drwx------ 2 root root 16384 09-27 10:51 lost+found
- drwxr-xr-x 2 root root 4096 09-27 20:27 media
- drwxr-xr-x 2 root root 4096 2006-02-11 misc
- drwxr-xr-x 2 root root 4096 2006-02-12 mnt
- drwxr-xr-x 2 root root 0 11-11 15:08 net
- drwxr-xr-x 2 root root 4096 2006-02-12 opt
复制代码
我们看见的每行最前面的那一串字符就是表示权限的。其中第一位表示文件的类型(d:目录,-:一般文件,l:链接,c:字符设备,b:块设备,最后在/dev目录中很常见,是表示设备的)。其后有九位,三位一组,第一组(2-4位)是说明文件所有者的权限的,第二组(5-7)位是说明与文件所有者同group其他用户对这个文件的权限,第三组(8-10)是所有人对这个文件的权限。每组的第一位是r表示读,第二位是w表示写,第三位是x表示可执行,如果某一位上是-说明就没有该位的相应权限。比如说/bin与root同group的人就没有写的权限因为它的是r-x,中间本应是w的那一位是-。
我们说的在详细点比如一个文件有这样的一个权限
我们把它先分组
- rwx r-x r--
- 所有者 同group者 其他人
复制代码
这样我们就可以清楚地看见谁有什么样的权限了。接着我们把有权限的为写成1,-位写成0的话会变成
这种形式,我们把它们化成十进数就变成了
所以我们也可以说这个文件的权限是754了。这回你应该明白为什么有时候说某个文件的权限是777,444,654等等了吧。下回看见了别再说它是777老虎机了。
好,文件系统我们就讲到这。其实文件系统的知识很多也很杂,我这里只是介绍了一下文件系统的4个block,和它们的作用,而且只是皮毛的皮毛。所以关于文件系统的知识希望大家还是多多参看其他的一些资料。
下一章,我们说说标准输入输出以及管道,在那里还将补充说明一些关于文件描述符和读写文件的一些知识,希望大家继续支持我! |
|