Unix高级编程-文件和目录

第4章文件与目录

4.1 stat、fstat和lstat函数

Int stat(const char * restrictpathname,struct stat* restrict buf);//返回与命名文件有关的信息结构

Int fstat(int filedes,struct stat*buf);  //打开文件的有关信息

Int lstat(const char* restrictpathname,struct stat *restrict buf);  //符号链接的有关信息

Struct stat{

Mode_t st_mode;//文件类型和权限

Ino_t st_ino;//i节点的数量

Dev_t st_dev;//文件所在设备号

Dev_t st_rdev;//特殊文件的设备号

Nlink_t st_nlink;//符号链接号

Uid_t st_uid;//文件所有者的用户id

Gid_t st_gid//文件所有者的组id

Off_t st_size;//文件的字节长

Time_t st_atime;//上次访问的时间

Time_t st_mtime;//上次修改的时间

Time_t st_ctime;//上次文件状态修改的时间

Blksize_t st_blksize;//最好I/O块大小

Blkcnt_t st_blocks;//磁盘块分配的数量

}

 

4.2文件类型<sys/stat.h>

Unix文件类型主要包括:

普通文件:文本文件或者二进制文件,S_ISREG()

目录文件:包含了其他文件的名字以及指向这些文件有关信息的指针,S_ISDIR()

块特殊文件:对设备带缓冲的访问,且访问长度固定, S_ISBLK()

字符特殊文件:对设备不带缓冲的访问,且访问长度可变,S_ISCHR()

FIFO:用于进程之间通信,也称为管道,S_ISFIFO()

套接字:用于进程之间的网络通信,S_ISSOCK()

符号链接:指向另一个文件,S_ISLNK()

4.3 设置用户ID与设置组ID

实际用户ID,实际组ID 与系统登陆口令文件中的登陆项有关

有效用户ID,有效组ID,附加组ID用于文件访问权限检查

保存的设置用户ID,保存的设置组ID,实际上是有效用户ID与有效组ID的副本

4.4文件访问权限

由9位二进制数表示xxx xxxxxx 前三位表示文件所有者的用户权限即可读/可写/可执行,中间三位表示文件所有组即可读/可写/可执行,后三位表示文件其他即可读/可写/可执行

文件的读/写/执行,文件的读写权限由open()决定

目录的读:即获取目录下的全部文件名

目录的写:允许增加或者删除目录下的文件

目录的可执行:允许搜索目录下的特定文件

通过open()或者create()创建的新文件的用户ID为该进程的有效用户ID

新文件的组ID则为该进程的有效组ID

新文件的组ID还可以为所在目录的组ID

4.5umask()函数

通过umask()可以设置统一的文件权限,比如002 则对应文件权限为rwx rwx rx

4.6修改文件权限

Int chmod(const char*pathname,mode_t mode);//通过文件名修改

Int fchmod(int filedes,mode_t mode);//通过文件描述符修改

4.7 粘住位

/tmp和/var/spool/uucppublic,只有拥有此文件/拥有此目录/超级用户 才能对此文件进行删除或者更名

4.8chown、fchown和lchown函数

用于更改文件的用户ID和组ID

Int chown(const char *pathname,uid_towner,gid_t group);

Int fchown(int filedes,uid_t owner,gid_tgroup);

4.9 文件截取

Int truncate(const char *pathname,off_tlength);

Int ftruncate(const char *pathname,off_tlength);

如果文件以前的长度大于length,则超过length以外的数据就不再访问

4.10文件系统

Unix操作系统由内到外依次是内核->系统调用->库函数->shell->应用软件

POSIX:可移植的操作系统接口

基本系统数据类型:

caddr_t:核心地址

clock_t 时钟滴答计数器

comp_t 压缩的时钟滴答

dev_t 设备号

fd_set 文件描述符

fpos_t 文件位置

gid_t 组ID

ino_t i节点编号

mode_t 文件类型

nlink_t 目录项的链接计数

off_t 文件的偏移量

pid_t 进程ID与进程组ID

ptrdiff_t 两指针相减的结果

rlim_t 资源限制

sig_atomic_t 能原子地访问的数据类型

sigset_t信号集

size_t 对象大小

ssize_t返回字节计数的函数

time_t日历时间的秒计数器

uid_t数值用户ID

wchar_t字符码

硬链接:允许多个目录项指向同一个i节点,每个i节点中均有一个链接计数,只有当链接技术减少至0时,才能删除该文件,其中链接计数包含在stat结构的st_nlink成员中,类型为nlink_t

符号链接:该文件的实际内容包含该符号连接所指向文件的名字,i接待你的文件类型是S_IFLNK

P87

Stat结构中的大部分信息取至i节点,只有两项数据存放在目录项(文件名和i节点标号)

创建一个新目录:则新目录的i节点的类型为目录文件,且其链接计数为2(命名该目录的目录项)以及在该目录中的.项,则其父目录大的链接计数大于或者等于3,因为还包含子目录的..项。

 

4.15 link、unlink、remove和rename

int link(const char* existingpath,const char *newpath);//根据existingpath创建一个硬链接newpath,实质上是创建了一个新目录项指向该文件的i节点,且i节点的链接计数+1;

int unlink(const char *pathname); //删除了对应的目录项且其指向的i节点的链接计数-1;

int remove(const char*pathname);,对于文件而言,与unlink函数功能相同,而对于目录而言与rmdir相同

int rename(const char *oldname,const char*newname);  //为文件/目录更名

4.16 符号链接

Int symlink(const char *actualpath,constchar *sympath);//创建符号链接

Ssize_t readlink(const char *restrictpathname.char *restrict buf,size_t bufsize);//执行读操作

4.17 文件的时间

St_mtime:内容最后一次被修改的时间

St_ctime:i节点最后一次被修改的时间

#include<utime.h>

Int utime(const char *pathname,const structutimbuf *time);  //文件的访问和修改时间

Struct utimbuf{

Time_t actime;  //访问时间

Time_t modtime;//修改时间

}

4.18 mkdir和rmdir函数

Int mkdir(const char *pathname,mode_t mode);

Int rmdir(const char *pathname);//该目录的链接计数达到0,且无其他进程打开目录,则释放该目录占用的空间。

#include <dirent.h>

DIR *opendir(const char *pathname);//打开一个目录

Struct dirent *readdir(DIR *dp);  //读目录

Void rewinddir(DIR *dp);//倒退目录

Int closedir(DIR *dp);//关闭目录

4.19 chdir,fchdir,getcwd(与工作目录有关)

Int chdir(const char *pathname);//修改当前工作目录

Int fchdir(int filedes);

Char *getcwd(char *buf,size_t size);//获得当前工作目录的绝对路径

4.23 设备特殊文件

UNIX文件系统中的存储设备通常由主次设备号表示,主设备号(major)标识设备驱动程序,次设备号(minor)标识特定的子设备

由于stat结构中包含st_dev是设备号,因此可通过major(st_dev)和minor(st_dev)分别获得主次设备

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值