目录
1.阻塞和非阻塞
2.fcntl 函数
3.位图
4.lseek 函数
5.传入参数传出参数
5.1传入参数
5.2传出参数
5.3传入传出参数
1.阻塞和非阻塞
- 阻塞、非阻塞是 设备文件、网络文件具备的属性(不是read、write的属性)。
- 产生阻塞的场景:
- 读设备文件。
- 读网络文件。 ---- 读常规文件无“阻塞”概念
- /dev/tty --- 终端文件。
- 设置 /dev/tty 文件,为非阻塞状态。—— 重新打开,指定 O_NONBLOCK 属性。
int fd = open("/dev/tty", O_RDWR|O_NONBLOCK);
2.fcntl 函数
- 作用:不重新打开文件,修改文件的访问权限。
- 函数原型和使用:
#include <fcntl.h>
int fcntl(int fd, int cmd, ...);
参2:
获取文件状态:F_GETFL
设置文件状态:F_SETFL
// 获取文件权限, 保存在 flg 中
int flg = fcntl(fd, F_GETFL)
// 修改文件权限,重新设置文件权限
flg |= O_NONBLOCK // 添加 非阻塞权限
fcntl(fd, F_SETFL, flg)
3.位图
int 32位
test.txt -- ls -l --> rw-rw-r--
4.lseek 函数
off_t lseek(int fd, off_t offset, int whence);
参数:
fd:文件描述符
offset:偏移量。正数向后,负数向前。
whence:起始偏移位置。 SEEK_SET/SEEK_CUR/SEEK_END
返回:
成功:较起始位置的偏移
失败:-1, errno
- 相关知识:
1. 文件的 “读”、“写” 使用的 同一偏移位置!!!
注意:write之后,文件读写指针处于结尾处,此时再次向后读,会什么都读不到,故要将文件读写指针的位置修改到文件开头
2. 可以使用 lseek 获取文件大小
返回文件起始位置到末尾的大小,即文件大小
3. 可以使用 lseek 拓展文件的大小。要想使文件大小真正发生拓展,必须要引起IO操作。
- 直接拓展文件,也可以使用 truncate() 函数来完成。
向后偏移十个位置
5.传入参数传出参数
5.1传入参数
1. 指针做函数参数
2. 通常有 const 关键字修饰
3. 指针指向有效区域,在函数内部做读操作。
- 例:write()、strcpy()参2
5.2传出参数
1. 指针做函数参数
2. 在函数调用之前,指针指向的空间可以无意义,但必须有效。
3. 在函数内部,做写操作。
4. 函数调用结束后,充当函数返回值。
- 例:strcpy()参1
5.3传入传出参数
1. 指针做函数参数
2. 在函数调用之前,指针指向的空间有效且有实际意义。
3. 在函数内部,先做读操作,后做写操作。
4. 函数调用结束后,充当函数返回值。
- 例:strtok_r()参3