Linux学习:文件 I/O 函数

1、open 函数

(1)头文件:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

(2)原型:

int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode)

(3)参数:
1)flag :
必选:O_RDONLY 、O_WRONLY 、O_RDWR 三个必含且只能含其一(彼此互斥)。
可选:O_CREAT(文件不存在,创建文件)、 O_APPEND(原文件后追加内容)、O_TRUNC(原文件清空,再添加内容)、 O_NONBLOCK(设置非阻塞)。
2)mode:八进制的数,用于设置文件权限 ,但并不是创建文件的最终权限。
(4)返回值:
1)成功:返回新的文件描述符。
2)失败:返回 -1,设置 errno。
“通过open创建的文件的权限” 跟 “实际权限” 的关系如代码所示:

int main()
{
 int fd = open("hello", O_RDWR | O_CREAT, 0777); // 当前目录下打开hello文件
 if(fd == -1)
 {
 perror("open fault");
 }
 close(fd);
 return 0;
}
#文件的实际权限是 mode & ~umask:umask 默认 0002,先取反在取与

2、read 函数

(1)头文件:#include <unistd.h>
(2)原型:

size_t read(int fd, void *buf, size_t count); // size_t 无符号整形值

(3)参数:
1)fd 文件描述符。
2) buf 传出参数:缓存区,用于存放读取的数据。
3)count 缓存区能存储的最大字节数 sizeof(buf)。
(4)返回值:ssize_t 类型(本质:有符号整形,意味着可以是负数)
1)失败:返回 -1
2)成功:> 0 读出的字节数 = 0 代表文件读完了。

3、write 函数

(1)头文件:#include <unistd.h>
(2)原型:

ssize_t write(int fd, const void *buf, size_t count);

(3)参数:
1) buf 传入参数:要写入文件的数据。
2) count buf 的实际长度 , 如果先读后写,一般采用 read 的返回值 len。
(3)返回值:
1)失败:返回 -1
2)成功:> 0 写入的字节数。

4、lseek 函数

(1)头文件:

#include <sys/types.h>
 #include <unistd.h>

(2)原型:

 off_t lseek(int fd, off_t offset, int whence);

(3)参数:
1)whence :设置文件指针的位置 。
2)offset :相对于文件指针位置的向后偏移量。
(4)返回值:文件指针的当前位置(相对于头部的偏移量)
(5)使用:
1)将文件指针移动到头部: lseek(fd, 0, SEEK_SET);
2) 获取文件指针的当前位置: int len = lseek(fd, 0, SEEK_CUR);
3) 获取文件长度: int len = lseek(fd, 0, SEEK_END);
4) 文件的拓展:原大小 100K 拓展为 1100K (拓展的 1000K 都是通过\0 占位):
第一步:lseek(fd, 1000, SEEK_END); //从尾部向后拓展 1000K
第二步:作一次写操作 write(fd, “a”, 1);
注意:文件拓展其实常用函数实现 truncate(fd, length)

5、阻塞和非阻塞

因为文件属性产生了阻塞现象。
普通文件默认非阻塞;管道、fifo、内存映射区、套接字都默认阻塞。
注意:open 时候可以通过 O_NONBLOCK 设置非属性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值