C语言文件IO文件的非读写操作3

非读写操作

(1)lseek函数 ------------ 调整文件指针位置

该函数的用法基本和fseek一样,唯一的区别是lseek使用文件描述符代表一个打开的文件

 标准IO  文件IO 

打开/关闭 fopen()/fclose() open()/close()
读 fgetc()/fgets()/fread()/fscanf() read()
写 fputc()/fputs()/fwrite()/fprintf() write()
移动文件指针 fseek() lseek()
代表打开的文件 文件流(FILE *) 文件描述符(fd)

(2)dup()/dup2() --------------- 复制文件描述符

这两个函数的作用是复制一个已经打开的文件描述符,用一个新的描述符代表他,之后可以通过新的复制的描述符访问之前描述符代表的文件

dup函数是由系统选择一个最小的没有使用的描述符当做新的描述符,dup2函数是由程序员指定新的描述符,如果指定的描述符已经被使用,就会先关闭再使用(安全隐患)

dup()/dup2()只复制文件描述符,不复制文件表

(3)fcntl函数 ----------- 复制文件描述符 设置/获取文件描述符属性 设置文件锁…

根据cmd参数决定该函数的功能

a.F_DUPFD  --------- 复制文件描述符,传入的第三个参数作为新描述符值,和dup2的区别是不会强行关闭已经使用的描述符,而是寻找大于等于参数的最小未使用的值

b.F_GETFL/F_SETFL  --------- 获取/设置文件描述符状态,比如权限;其中创建标志不能获取也不能修改,权限标志不能修改

c.F_GETLK/F_SETLK/FSETLKW ----------- 文件锁的操作

    设计文件锁的原因是防止多个程序同时对文件进行读写操作数据混乱

    文件锁是当一个进程在读写文件时,对其他进程的读写操作进行限制

    限制规则:

        一个进程写,其他进程不允许读/写

        一个进程读,允许其他进程读,不允许其他进程写

    文件锁是一种读写锁,包括写锁和读锁

        写锁是一个互斥锁,不允许其他进程读/写,如果进程是写文件,必须加写锁

        读锁是一个共享锁,允许其他进程读,不允许其他进程写,如果进程是读文件,应该加读锁

当cmd为F_SETLK/F_SETLKW,可以用来给文件加锁 

使用文件锁时,第三个参数就是锁结构

struct flock {

short l_type; /* 锁的类型: F_RDLCK—读锁,
F_WRLCK—写锁, F_UNLCK—解锁 /
short l_whence; /
锁定起始点的基准:
SEEK_SET, SEEK_CUR, SEEK_END /
off_t l_start; /
锁定位置针对锁定起始地点的偏移量*/
off_t l_len; /* 锁定的区间长度 /
pid_t l_pid; /
只对F_GETLK有效,一般给-1 */

};

其中l_type决定锁的类型,l_whence l_start l_len决定锁定的位置

如果加锁程序已经结束,锁自动释放,但是我们应该手动释放

注:文件锁并不是锁定文件的读写操作,而是在文件上加上一个锁定的标志,文件锁锁定的是加锁行为,文件锁的正确用法是:

    在读/写文件之前,对文件进行加锁操作,在读写完成之后,进行解锁操作

如:

程序1:

加锁

写文件

解锁

程序2:

加锁

写文件

解锁

F_SETLKW和F_SETLK的区别在于F_SETLKW在获取不到锁时会在原地阻塞,直到获取锁成功

F_GETLK不是用来获取锁,而是用来测试某个锁是否可以加上,并不是真正加锁

(4)stat函数 ----------- 获取文件属性信息

参数:

path:要获取信息的文件路径

buf:传出参数,传出文件信息

返回值:

成功返回0,失败返回-1

struct stat结构体:

struct stat {
dev_t st_dev; /* 组成器的设备号*/
ino_t st_ino; /* inode编号*/
mode_t st_mode; /* 文件类型和权限*/
nlink_t st_nlink; /* 引用数*/
uid_t st_uid; /* 所有者用户ID /
gid_t st_gid; /
所有者的组ID /
dev_t st_rdev; /
设备号 /
off_t st_size; /
大小 /
blksize_t st_blksize; /
块大小 /
blkcnt_t st_blocks; /
块个数 /
time_t st_atime; /
最后一次访问时间 /
time_t st_mtime; /
最后一次修改时间 /
time_t st_ctime; /
最后一次状态发生变化时间 */
};

注:ctime函数可以将time_t类型转换成时间字符串

st_mode的8进制高2位表示文件类型,可以使用以下宏来判断

st_mode的8进制低3位表示权限

st_mode&0777

fstat和stat的区别在于传入的是文件描述符

lstat和stat的区别在于如果文件是软链接,stat获取的是原文件的信息,lstat获取的是软链接本身的信息

(5)access函数 ------------ 测试用户对文件的权限或者文件是否存在

参数:

pathname:要测试的文件路径

mode:要测试的内容

    R_OK:读权限

    W_OK:写权限

    X_OK:执行权限

    F_OK:是否存在

返回值:

返回0表示有权限/文件存在

(5)其他函数

chmod() ------------ 修改文件权限

remove() ----------- 删除文件/空目录

unlink() ---------- 删除文件

rmdir() ---------- 删除空目录

umask() --------- 修改权限屏蔽字

rename() -------- 文件改名

truncate() -------- 指定文件大小

mkdir() --------- 创建目录

chdir() -------- 切换当前目录(cd)

getcwd() --------- 获取当前绝对路径(pwd)

作业:

设计一个登录程序,分为超级管理员和普通账户,超级管理员账号和密码固定(admin 12345)

超级管理员可以添加和删除普通账户,普通账户需要通过用户名和密码登录

如果连续三次用户名密码输入错误,要求三分钟后才可继续登录(time)

猜你喜欢

转载自blog.csdn.net/qq_41256954/article/details/88987757