文件IO中用文件描述符表示一个打开的文件,可以访问不同类型的文件如普通文件、设备文件和管道文件等待
1. 文件打开和关闭
函数原型:int open(const char *pathname, int flags, int perms)
函数参数:pathname 被打开的文件名
flags 文件打开的方式
perms 新建文件的存取权限
函数返回值:成功---返回文件描述符;失败--- -1
flags值 | 取值说明 |
---|---|
O_RDONLY | 以只读方式打开文件 |
O_WRONLY | 以只写方式打开文件 |
O_RDWR | 以读写方式打开文件 |
O_CREAT | 若文件不存在,就创建新文件,并用perms参数为其设置权限 |
O_EXCL | 若使用O_CREAT时文件已存在,则可返回错误消息 |
O_NOCTTY | 若打开的是终端文件,那么该中断不会成为当前进程的控制终端 |
O_TRUNC | 若文件存在,会删除文件中的原有数据,且设置文件大小为0 |
O_APPEND | 写文件时,文件读写位置自动指向文件末尾 |
函数原型:int close(int fd)
函数参数:fd 文件描述符
函数返回值:成功--- 0;失败--- -1
2. 文件读写
函数原型:ssize_t read(int fd, void *buf, size_t count)
函数参数:fd 文件描述符
buf 指定存储器读出数据的缓冲区
count 指定读出的字节数
函数返回值:成功---读到的字节数;出错--- -1; 到达文件尾--- 0
函数原型:ssize_t write(int fd, void *buf, size_t count)
函数参数:fd 文件描述符
buf 指定存储器写入数据的缓冲区
count 指定写入的字节数
函数返回值:成功---已写的字节数;出错--- -1;
3. 文件定位
lseek()函数对文件当前读写位置进行定位。它只能对可定位(可随机访问)文件操作。管道、套接字和大部分字符设备文件不支持此类操作。
函数原型:off_t lseek(int fd, off_t offset, int whence)
函数参数:fd 文件描述符
offset 相对于基准值的偏移量,以字节为单位,正数表示向前移动,负数表示向后移动
whence 基准值
-->SEEK_SET 代表文件起始位置
-->SEEK_END 代表文件结束位置
-->SEEK_CUR 代表文件当前读写位置
函数返回值:成功---文件当前读写位置;失败--- -1
4. 文件锁
多个程序共同操作一个共享文件时,通过给文件上锁的方法来解决对共享资源的竞争。
函数原型:int fcntl(int fd, int cmd, struct * flock)
函数参数:fd 文件描述符
cmd -->F_GETLK:检测文件锁状态
-->F_SETLK:设置lock描述的文件锁
-->F_SETLKW:F_SETLK的阻塞版本
-->若无法获取锁,会进入睡眠状态;若可以获取锁或捕捉到信号则会返回
flock 如果cmd和锁操作有关,则需要使用该参数
函数返回值:成功--- 0;失败--- -1
flock 结构体定义
struct flock{
short l_type;
off_t l_start;
short l_whence;
off_t l_len;
pid_t l_pid;
}
flock结构体 | 各成员含义 |
---|---|
l_type | F_RDLCK:读取锁(共享锁) |
F_WRLCK:写入锁(排斥锁) | |
F_UNLCK:解锁 | |
l_start | 加锁区域在文件中的相对位移量(字节),与 l_whence一起决定加锁区域的其实位置 |
l_whence | SEEK_SET:当前位置为文件的开头,新位置为偏移量的大小 |
SEEK_CUR:当前位置为文件指针的位置,新位置为当前位置加上偏移量 | |
SEEK_END:当前位置为文件的结尾,新位置为文件的长度加上偏移量 | |
l_len | 加锁区域的长度 |
l_pid | 具有阻塞当前进程的锁,其持有进程的进程号存放在l_pid中,仅由F_GETLK返回 |
若要加锁整个文件:l_start = 0;l_whence = SEEK_SET;l_len = 0
关注我的公众号,共同交流学习嵌入式开发相关技术: