免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: naker
打印 上一主题 下一主题

UNIX系统编程(10月11号更新 1楼,2楼,11楼,20楼,53楼,54楼) [复制链接]

论坛徽章:
0
11 [报告]
发表于 2006-11-11 18:57 |显示全部楼层
书接上回,上次我们说到了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里面的信息。这个程序是将我们指定的两个文件名中输出更新时间晚的一个
  1. #include <sys/types.h>
  2. #include <sys/stat.h>
  3. #include <stdio.h>
  4. int main( int argc , char *argv )
  5. {
  6.         struct stat buf[2] , *p ;
  7.         if( argc!=3 )
  8.         {
  9.                 fprintf( stderr , "Usage : %s file1 file2\n" , argv[0] );
  10.                 exit(1);
  11.         }
  12.         p=buf;
  13.         if( stat(argv[1],p)!=0 )
  14.         {
  15.                 fprintf( stderr , "%s not found !\n" , argv[1] );
  16.                 exit(1);
  17.         }
  18.         p++;
  19.         if( stat(argv[2],p)!=0 )   
  20.         {
  21.                 fprintf( stderr , "%s not found !\n" , argv[2] );
  22.                 exit(1);
  23.         }
  24.         if( buf[0].st_mtime > buf[1].st_mtime )       //比较更新时间
  25.                 printf( "%s\n" , argv[1] );
  26.         else
  27.                 printf( "%s\n" , argv[2] );
  28.         return 0;
  29. }
复制代码

大家可以自己执行一下看看结果。
我们来说说stat(),使用它可以得到一个叫stat的结构体,它包含了i-node里面的一部分信息。诸如,文件的权限,i-node号,链接数,所有者id,组id,文件大小等等。具体的大家可man stat查看一下。
  1. 作用:得到一个stat结构体。
  2. #include <sys/types.h>
  3. #include <sys/stat.h>
  4. int stat( char *path , struct stat *buf );
  5. 返回值:        成功时:0 失败时:-1
复制代码

为了简洁,我们的程序里没有考虑到更新时间相同的文件。大家可以自己补上。

下面我们做一个改变文件权限的程序。
  1. #include <sys/types.h>
  2. #include <sys/stat.h>
  3. #include <stdio.h>
  4. #define MASK 0555 //设置掩码
  5. int main( int argc , char *argv[] )
  6. {
  7.         struct stat buf[1];
  8.         mode_t mode;
  9.         if( argc!=2 )
  10.         {
  11.                 fprintf( stderr , "Usage : %s file\n" , argv[0] );
  12.                 exit(1);
  13.         }
  14.         if( stat(argv[1],buf)!=0 )
  15.         {
  16.                 fprintf( stderr , "Cannot read i-node\n" );
  17.                 exit(1);
  18.         }
  19.         mode = ( buf[0].st_mode & MASK );     
  20.         if ( chmod(argv[1],mode)!=0 )         //改变文件的权限
  21.         {
  22.                 fprintf( stderr , "Cannot change mode\n" );
  23.         }
  24.         return 0;
  25. }
复制代码


怎么样这个程序不能我直接说里面的系统调用

chomd()
  1. 作用:改变文件的权限(关于权限下面要说)
  2. #include <sys/types.h>
  3. #include <sys/stat.h>
  4. int chmod( char *path , mode_t mode );
  5. 返回值:        成功时:0 失败时:-1
复制代码

那什么是文件的权限呢?你可以用
  1. $ls –l /
复制代码

命令来查看根目录下所有子目录的权限。你会看见类似下面这样的
  1. drwxr-xr-x  2 root root  4096 11-04 22:43 bin
  2. drwxr-xr-x  4 root root  1024 09-27 02:15 boot
  3. drwxr-xr-x 10 root root  3640 11-11 15:08 dev
  4. drwxr-xr-x 88 root root 12288 11-11 15:08 etc
  5. drwxr-xr-x  3 root root  4096 09-27 02:40 home
  6. drwxr-xr-x 11 root root  4096 10-31 21:49 lib
  7. drwx------  2 root root 16384 09-27 10:51 lost+found
  8. drwxr-xr-x  2 root root  4096 09-27 20:27 media
  9. drwxr-xr-x  2 root root  4096 2006-02-11 misc
  10. drwxr-xr-x  2 root root  4096 2006-02-12 mnt
  11. drwxr-xr-x  2 root root     0 11-11 15:08 net
  12. 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的那一位是-。
我们说的在详细点比如一个文件有这样的一个权限
  1. rwxr-xr--
复制代码

我们把它先分组
  1. rwx        r-x         r--
  2. 所有者    同group者   其他人
复制代码

这样我们就可以清楚地看见谁有什么样的权限了。接着我们把有权限的为写成1,-位写成0的话会变成
  1. 111     101    100
复制代码

这种形式,我们把它们化成十进数就变成了
  1. 7       5      4
复制代码

所以我们也可以说这个文件的权限是754了。这回你应该明白为什么有时候说某个文件的权限是777,444,654等等了吧。下回看见了别再说它是777老虎机了。

好,文件系统我们就讲到这。其实文件系统的知识很多也很杂,我这里只是介绍了一下文件系统的4个block,和它们的作用,而且只是皮毛的皮毛。所以关于文件系统的知识希望大家还是多多参看其他的一些资料。
下一章,我们说说标准输入输出以及管道,在那里还将补充说明一些关于文件描述符和读写文件的一些知识,希望大家继续支持我!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP