Day26

文件锁

作用:解决多个进程对文件的操作冲突,执行文件之前加锁,,能加上锁再操作,上锁后,其他进程无法对文件进行操作

#include <fcntl.h>

int fcntl(int fd, F_SETLK/F_SETLKW, struct flock* lock)

功能:加解锁

参数:F_SETLK 非阻塞模式 加锁加不上立即返回

  F_SETLKW 阻塞模式 加锁一直到成功为止才返回

  lock 要加的锁

⭐struct flock{

short I_type; //锁类型:F_RDLCK/F_WRLCK/F_UNLCK

short I_whence; //锁区偏移起点:SEEK_SET/SEEK_CUR/SEEL_END

off_t I_start; //对于起点偏移字节数

off_t I_len; //锁区字节数  给0一直锁到文件尾

pid_t I_pid; //加锁进程的PID,-1表示自动设置

}

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

⭐文件锁是一个君子协议,大家都遵循加锁——读写——解锁按部就班执行才能生效,当一个进程对一个被其他进程已加锁的文件直接进行读写操作时,不会被约束。

  当close()函数关闭描述符时,该进程所加的锁会自动解除

  当进程结束时,所有文件描述符所加的一切锁都被自动解除

锁实质就是建一个名为锁表的链表,加锁就是通过指针遍历验证在锁表中是否有重复的锁节点,没有就加节点

sleep(int x);

作用:延时x秒

文件的元数据

#include <sys/stat.h>

int stat(char const* path, struct stat* buf);

int fstat(int fd, struct stat* buf);

int lstat(char const* path, struct stat* buf);

功能:从i节点提取文件的元数据,即属性信息,存入buf结构体中

参数:path:文件路径

  buf: 文件元数据结构

  fd: 文件描述符

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

struct stat{

dev_t st_dev; //设备id

ino_t st_ino; //i节点号

mode_t st_mode; //文件的类型和权限

nlink_t st_nlink; //硬链接数

uid_t st_uid; //拥有者用户id

gid_t st_gid; //拥有者组id

dev_t st_rdev; //特殊设备id

off_t st_size; //总字节数

blksize_t st_blksize; //I/O块字节数

blkcnt_t st_blocks; //存储块数

time_t st_atime; //最后访问时间

time_t st_mtime; //最后修改时间

time_t st_ctime; //最后状态改变时间

}

⭐st_mode被定义为32位无符号整数,只有低16位有意义,从高到低

b15-b12:文件类型

b11-b9:设置用户id,设置组id,粘滞

b8-b6:拥有者用户的读、写和执行权限

b5-b3:拥有者组的读、写和执行权限

b2-b0:其他用户的读 写和执行权限

有参宏辅助分析文件类型,是返回1,否返回0

S_ISREG() 是否普通文件

S_ISDIR() 是否目录

S_ISSOCK() 是否本地套接字

S_ISCHR() 是否字符设备

S_ISBLK() 是否块设备

S_ISLNK() 是否符号链接

S_ISFIFO() 是否有名管道

通过内存映射文件可以实现一个文件对两个进程的关联,进程之间的通讯

strcpy()函数不是专门的文件读写函数,无法改变文件大小,一旦写入的字符串超过文件大小,写入会失败

  • 21
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值