UNIX系统程序设计-5-编程语言-电脑网络-搜狐社区: "第五章:目录及文件操作
上一章我们说了一些UNIX的文件系统的物理构造。下面我们来看看具体怎么对文件进行操作。当然这里所说的文件及目录操作不是fopen()。呵呵。我们要做一些fopen办不到的事。
/* newer.c 比较参数所指定的两个文件
将其中新的文件的文件名输出来 */
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
int main( int argc , char *argvp] )
{
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;
}
执行结果:
%newer afile bfile
bfile
使用stat()函数,可以得到文件的信息。这些信息是在i node中保存的这个文件信息的一部分。得到的信息将会保存在stat.h中定义的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' );
exit(1);
}
return 0;
}
现在来解释一下0555这个数字的意思。
众所周知,UNIX是一个多用户多任务的操作系统。每个用户有自己的权限,这个权限限制了用户可以做哪些事,不可以做哪些事。对于文件来说,用户可以分成四类:
root(根用户,超级用户)
这个用户是系统的管理呐,权限最大,可以随意读写任何文件。
owner(文件拥有者)
实际拥有文件的用户。文件属主。
group(组成员)
用户所在的用户组的成员
other
以上三类之外的其它用户
UNIX中,每个文件信息中包括一组9位的权限标志。分别给文件属主,用户组和其他用户指定对该文件的读、写和执行权。请看下面的例子:
%ls -l /bin/ls
-rwxr-xr-x 1 root bin 27281 Aug 15 2002 /bin/ls*
重要是看-rwxr-xr-x,第一个 - 表示这是一个普通文件,这个位置也可以出现些别的字符,比方说目录的话这里会是 d 。而 l 表示一个链接。余下的9位可以分成三段,每段三位。本例中从左至右
rwx 表示文件的属主拥有文件的读,写,执行权
r-x 表示同组的用户拥有文件的读,执行权(注意 ,“写”权限的位置是一个 - )
r-x 表示其它的用户拥有文件的读,执行权
文件的访问权限还可以用三位8进制来表示。如上例
rwx r-x r-x 可以换成
111 101 101 (有该权限,则该位为1,否则为0)
换成8进制, 二进制的111是八进制的7 , 二进制的101是八进制的5。
现在看看0555是什么意思?就是说,可以读,可以写的意思。
把0555和原来文件的权限标志做与运算,得到的新的权限标志就是把原来的文件权限标志中所有的写权限全取消了。其余权限变。然后在程序中用chmod()把这个新的权限标志赋给文件即可。
chomd()函数用法如下:
#include <sys/types.h>
#include <sys/stat.h>
int chmod( char *path , mode_t mode );
返回值: 成功时:0
失败时:-1
关于目录,还有另一个比较有用的函数,即chdir()。用这个函数可以在程序中转换当前目录。
#include <sys/types.h>
#include <sys/stat.h>
int chdir( char *path );
返回值: 成功时:0
失败时:-1
以上两章,简单地叙述了一下UNIX的文件系统以及在UNIX C中对文件的操作方法。并列举了常用的一些函数。
下一章,我们将简单地叙述一下UNIX C的输入输出,以及用管道(pipe)实现两个进程互换数据。"
没有评论:
发表评论