回顾:
文件 - 文件读写、字符串的处理、dup() dup2()文件描述符的复制、lseek()、fcntl()复制文件描述符、设置/获取文件表的状态、介绍了读写锁的概念
今天:
文件锁、文件的其他相关函数、目录操作
文件锁的原理:
读写锁,包括一个读锁和一个写锁
读锁:共享锁,锁定其他进程的写操作,允许其他进程读。
写锁:独占锁,锁定其他进程的读操作和写操作。
文件锁对应一个结构,内容:
struct flock{
short l_type; //锁的类型
short l_whence;//锁的开始位置的参照点
int l_start;//锁的开始位置的偏移量
int l_len;//锁定的长度,字节为单位
pid_t l_pid;//加锁的进程ID
};
l_type包括三种:F_RDLCK 读锁 F_WRLCK 写锁
F_UNLCK 释放锁
l_whence和l_start 联合决定锁定的开始位置,比如:l_whence = SEEK_SET l_start=10;从文件开始第10个字节上锁。
l_pid只在F_GETLK时有效,其他时候置 -1 即可。
文件锁不能锁定硬盘上的文件,不能锁定read/write函数,只能阻止其他进程的上锁行为。
文件锁的正确用法:在调用读函数read()之前应该上读锁,在调用写函数之前上写锁。
使用文件锁时,其他进程默认是加不上锁会返回错误,可以用F_SETLKW实现加不上锁 继续等待的效果。
fcntl的cmd为F_GETLK时,不是获取锁,而是:
测试某个锁能否加上,不会真正的加锁。
如果锁可以加,调用F_GETLK的结果:
struct flock的其他数据不变,锁的类型l_type变为F_UNLCK。
如果锁不可以加,调用F_GETLK的结果:
struct flock的数据都会发生改变,锁的类型、锁的l_whence、l_start、l_len变成 当前正在起作用的锁的相关信息,l_pid 变成当前正在加锁的进程ID。
(不是测试的进程)
文件的其他相关函数
标C取文件大小:
fseek()到最后
ftell()取得返回值 就是文件的大小。
Uc取文件的状态(属性)的函数:stat/fstat,经常用于取文件的大小。
stat函数用字符串表示文件,fstat用文件描述符表示文件。stat函数不需要open()就可以取文件状态
标C的时间表示方式有两种:
1 time_t 秒差,和1970年1月1日0点0分0秒的秒查
2 struct tm,包括 年月日小时分秒星期 等。
计算机更多的使用time_t,显示时都用tm。
localtime()可以实现time_t 到 tm的转换。
access()函数可以判定文件的权限(读写执行)以及文件是否存在。
umask()可以设置创建文件时的 权限屏蔽字。
chmod() 可以修改文件的权限
truncate()/ftruncate()可以指定文件的大小
remove()可以删除文件/目录
rename()可以修改文件名/目录名
mmap映射文件 - 虚拟内存地址映射硬盘上的文件
目录操作
4个函数:
mkdir() - 新建目录
rmdir() - 删除 空目录
chdir() - 改变当前目录(cd)
getcwd()- 取得当前目录(pwd但不会打印)
2个读目录函数:
opendir() - 打开一个目录
readdir() - 读目录,依次返回目录的子项
练习&作业:
1 完成递归的练习
2 写一个myls,实现 ls -l的功能。(不着急)
3 今天代码较多,复习一下
一个myls,实现 ls -l的功能。(不着急)
3 今天代码较多,复习一下