UNIX环境高级编程读书笔记 第一部分 文件 (第四章 文件和目录)

从文件信息结构体stat说起:

struct stat{

     mode_t    st_mode;

     ino_t        st_ino;

     dev_t       st_dev;

     nlink_t     st_nlink;

     uid_t        st_uid;

     gid_t        st_gid;

     off_t         st_size;

     time_t      st_atime;

     time_t      st_mtime;

     time_t      st_ctime;

     blksize_t  st_blksize;

     blkcnt_t    st_blocks;

};

输入这个结构体太不容易了。之所以还要敲它只是因为它太重要了,几乎所有与文件相关的信息都在其中,这也就自然形成了一条学习文件的线索。

为了理解各个成员变量我们需要来看看UNIX文件系统的一些基本知识:

UNIX文件系统特点:

   1)分级树形结构;

   2)文件物理块采用混合索引结构组织;

   3)采用成组链接法管理空闲盘快;

UNIX文件涉及的存储结构:

  未打开状态:

   1)一个目录项,记录文件名和对应的索引节点编号;

   2)一个磁盘索引节点项,用于记录文件的属性和说明信息, 驻留在磁盘上;

   3)若干盘块,用以保存文件本身;

打开状态又增加:

  1)一个内存索引节点项,该项驻留在内存中;

  2)文件表中的记录项;

  3)用户文件描述符表中的一个登记项;

 

UNIX文件的物理结构:

   还是参见汤小丹编著的计算机操作系统(西安电子科技大学出版社)p383;

一些函数:

#include<sys/stat.h>

int stat(const char *pathname,struct stat *restrict buf);

 

这里要说一下关键字restrict 它的意思是只能通过buf指针才能改变buf指针所指的内存区的内容。

 

mode_t  umask(mode_t cmask );

   //设置调用进程的文件创建屏蔽字;

 

int chmod(const char *pathname, mode_t mode);

  //改变文件访问权限(注意得有权限才回成功返回);

int chown(const char *pathname, uid_t  ower , gid_t group);

 //更改文件所有者用户ID和组ID;

 

int link(const char *existingpath , const char * newpath);

  //为现存文件创建新的路径(硬链接)(这个困扰了我很长时间,总是把它当成快捷方式啦);

 

硬链接:和普通的文件路径一样也是文件路径,连接的同一个文件的路径可能不止一个(注意它和windows中是快捷方式不一样,是一个真正的路径);其实,快捷方式和符号连接类似;

 

int unlink(const char *pathname);

  //删除现存的路径pathname,将pathname所引用的文件连接计

  //数减一;

 

int symlink(const char *restrict pathname, const char * sympath);

   //创建符号连接,是软连接;

 

目录的操作:

其实读目录就像读普通文件一样;

DIR * opendir(const char * pathname);

  //打开目录,返回目录指针(多像打开文件呀);

struct dirent  *readdir(DIR *dp);

  //读目录中的目录项;

这里有必要说一下ent,其实它是entry (条目、项 还是你用有道查一查吧)dirent 就是目录项结构体,每次读一个目录项;

sturct dirent{

    ino_t d_ino;       /*文件索引节点编号*/

    char d_name[NAME_MAX+1]; /*文件名*/

};

 

 

void rewinddir(DIR *dp);

  // 想想标志文件io函数就懂它了。

int closedir(DIR *dp);

 

long telldir(DIR *dp);

 

void seekdir(DIR *dp,long len);

 

 

更改当前工作目录:

#include<unistd>

int chdir(cost char *pathname);

 

char *getcwd(char *buf , size_t size);

  /*获得当前工作路径的绝对路径*/

 

 

 

 

 

 

 
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值