open、 close、 write、 read、 lseek详解

linux系统最常用的API函数就是:open、 close、 write、 read、 lseek
下面我们用man手册看一下这几个函数的原形和用法:
man 1 xxx 查 linux shell 命令,man 2 xxx 查 API, man 3 xxx 查库函数


API: open

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
这样的函数原型有些违背了我们的直觉。 C语言是不支持函数重载的, 为什么open的系统调用可以有两个这样的open原型呢? 内核绝对不可能为这个功能创建两个系统调用。 在Linux内核中, 实际上只提供了一个系统调用, 对应的是上述两个函数原型中的第二个。 那么open有两个函数原型又是怎么回事呢?
当我们调用open函数时, 实际上调用的是glibc封装的函数, 然后由glibc通过自陷指令, 进行真正的系统调用。 也就是说, 所有的系统调用都要先经过glibc才会进入操作系统。 这样的话, 实际上是glibc提供了一个变参函数open来满足两个函数原型, 然后通过glibc的变参函数open实现真正的系统调用来调用原型二

flags 参数详解:
O_RDONLY //只读打开
O_WRONLY //只写打开
O_RDWR //读、写打开
O_APPEND //每次写时都追加到文件的尾端
O_CREAT //若此文件不存在,则创建它。 使用时,需要第三个参数 mode
O_EXCL //如果同时指定了 O_CREAT,而文件已经存在,则会出错。用此可以测试一个文件是否存在,
如果不存在,则创建此文件。
O_TRUNC //如果此文件存在,而且为只写或读写成功打开,则将其长度截短为 0。
O_NONBLOCK //如果 pathname 指的是一个 FIFO、一个块特殊文件或一个字符特殊文件,则此选项为文
件的本次操作和后续的 I/O 操作设置非阻塞模式。只用于设备文件,不能用于普通文件。
O_SYNC //使每次 write 都等到物理 I/O 操作完成,包括由 write 操作引起的文件属性更新所需的
I/O。

Mode参数:
使用四个数字指定创建文件的权限,与 linux 的权限设置相同,如 0755
譬如一般创建一个可读可写不可执行的文件就用 0666
还可以宏来表示,具体可以看man手册


API: close
#include <unistd.h>
int close(int fd);
close 函数----关闭文件描述符 fd 指向的动态文件,并存储文件和刷新缓存


API: read write
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
read 函数—Read 成功返回读取的字节数,失败返回-1
#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);
write 函数—Write 成功返回写入的字节数,失败返回-1
count 和返回值的关系。 count 参数表示我们想要写或者读的字节数,返回值表示实际完成的要写或者读
的字节数。实际的有可能等于想要读写的,也有可能小于(说明没完成任务)


API: lseek
#include <sys/types.h>
#include <unistd.h>
off_t lseek(int fd, off_t offset, int whence); //offset 可以给0
返回值:成功 返回距离文件开头的偏移
offset 参数:offset为正则向文件末尾移动(向前移),为负数则向文件头部(向后移)。
whence 参数:
SEEK_SET:
  从文件头部开始偏移offset个字节。 offset为负数,读到的依然是第0个字符
SEEK_CUR:
  从文件当前读写的指针位置开始,增加offset个字节的偏移量。 offset可以为负数
SEEK_END:
  文件偏移量设置为文件的大小加上偏移量字节。offset可以为负数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值