文件IO编程

文件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

关注我的公众号,共同交流学习嵌入式开发相关技术:
Linux文件I/O编程_函数返回值